ACM水题-合法字符串 (AC,递归遍历,分情况,代码比较长)
来源:互联网 发布:iphone把照片导入mac 编辑:程序博客网 时间:2024/06/05 17:23
合法字符串
Time Limit:1000MS Memory Limit:65536K
Description:
一个合法的字符串是指最少含有一个元音字符和两个辅音字符的字符串。元音字符包括六个(a、o、e、i、u),其它小写字母都是辅音字符。现给你由多个小写字母组成的字符表,要你按字典序输出由这些字符表里的字母组成的所有长度为L的合法字符串。注:一个字符串里每个字母最多只能出现一次。Input:
输入包含多组测试数据。每组测试数据的第一行包含两个整数L、C,分别表示合法字符串的长度和给定的字符表里的字母个数。3<=L<=15,L<=C<=26。Output:
针对每组测试数据,按字典序输出所有长度为L的合法字符串。Sample Input:
4 6a t c i s w
Sample Output:
acisacitaciwacstacswactwaistaiswaitwastwcistciswcitwistw
链接:http://acm.zjut.edu.cn/ShowProblem.aspx?ShowID=1437
/*-------------------------------------------------------------------------------------------大概想法:一般遇到这些题目,看似是排列组合的,有很多情况,而且每一步又和上一步可以组合的 自己一般都是往递归那边想。详见注释。时间:15MS内存:160K时间复杂度分析:。。。。这个。。这个还真不会分析。。。。难道是O(nlogn)?-------------------------------------------------------------------------------------------*/#include<stdio.h>#include<memory.h>//判断是否为元音字母#define ISVOW(ch) ((ch == 'a') || (ch == 'e') || (ch == 'i') || (ch == 'o') || (ch == 'u'))//递归函数void Print(int L, int nVowNeed,int nAssitNeed , int nIndex,int nStackTop) ;int nNum[28] ;//用来标志输入中有哪些字符,对应下标加上a,就是那个字符char chStack[28] ;//栈,用来保存合法的字符串int main(void){int i = 0 ; int nVow = 0 ;//输入中元音字母的个数int nAsist = 0 ;//输入中辅音字母的个数int nVowNeed = 0 ;//合法字符串中元音最少需要的个数int nAsistNeed = 0 ;//合法字符串中辅音最少需要的个数int nStackTop = 0 ;//栈顶int L = 0 ;int C = 0 ;int nTempTop = 0 ;int nTempL = 0 ;int nTempVowNeed = 0 ;int nTempAssitNeed = 0 ;char chTemp = 0 ;while(scanf("%d%d",&L,&C) != EOF){getchar() ;memset(nNum,0,sizeof(nNum)) ;nVow = nAsist = 0 ;nVowNeed = 1 ;nAsistNeed = 2 ;nStackTop = 0 ;for(i = 0 ; i < C ; ++i){scanf("%c",&chTemp) ;getchar() ;nNum[chTemp-'a'] = 1 ;if(ISVOW(chTemp)){nVow++ ;}else{nAsist++ ;}}nTempTop = nStackTop ;nTempL = L ;nTempVowNeed = nVowNeed ;nTempAssitNeed = nAsistNeed ;for(i = 0 ; i < 21 ; ++i) //到21的原因是,u是排20{chTemp = 'a' + i ;//每一次循环都要复位nStackTop = 0 ;L = nTempL ;nVowNeed = nTempVowNeed ; nAsistNeed = nTempAssitNeed ;if(nNum[i] != 0 && nVow >=nVowNeed && nAsist >= nAsistNeed){if(ISVOW(chTemp)){chStack[nStackTop++] = chTemp ;L-- ;nVowNeed-- ;}else{chStack[nStackTop++] = chTemp ;L-- ;nAsistNeed-- ;}Print(L,nVowNeed,nAsistNeed,i+1,nStackTop) ;}}}return 0 ;}void Print(int L, int nVowNeed,int nAssitNeed , int nIndex,int nStackTop){int i = 0 ;int nTempTop = nStackTop ;int nTempL = L ;int nTempVowNeed = nVowNeed ;int nTempAssitNeed = nAssitNeed ;char chTemp ;if(L <= 0 || nIndex >= 26){if(L <= 0)//必须填满L才是合法的长度,不然的话会有短的输出{chStack[nStackTop] = '\0' ;puts(chStack) ;}return ;}else{for(i = nIndex ; i < 26 ; ++i)//26是因为不是字符串中的第一个字符就可以{nStackTop = nTempTop ;//每一次循环都要复位L = nTempL ;nVowNeed = nTempVowNeed ; nAssitNeed = nTempAssitNeed ;chTemp = 'a' + i ;if(nNum[i] != 0){if(ISVOW(chTemp) && nVowNeed > 0)//是元音且合法字符串中还木有一个无间字符{chStack[nStackTop++] = chTemp ;nVowNeed-- ;L-- ;}else if(ISVOW(chTemp) && nVowNeed <= 0 && L > nAssitNeed) //是元音且合法字符串中已经有一个元音,且合法字符串中剩余的长度可以容纳需要的辅音字符个数{chStack[nStackTop++] = chTemp ;nVowNeed-- ;L-- ;}else if(!ISVOW(chTemp) && nAssitNeed > 0 ) //元音同理{chStack[nStackTop++] = chTemp ;nAssitNeed-- ;L-- ;}else if(!ISVOW(chTemp) && nAssitNeed <= 0 && L > nVowNeed){chStack[nStackTop++] = chTemp ;nAssitNeed-- ;L-- ;}else continue ;Print(L,nVowNeed,nAssitNeed,i+1,nStackTop) ;}}}}
- ACM水题-合法字符串 (AC,递归遍历,分情况,代码比较长)
- ACM水题-Differing sequence(AC,递归,分情况)
- ACM水题-AB串(AC,分情况,要小心陷阱,两种思路)
- 字符串的故事(AC,代码有点长)
- acm hnu 10415 分硬币的一种解法(递归遍历二叉树的方法,超时)
- ACM-ACMICPC (AC,动态规划/遍历所有字串,三份代码)
- ACM水题-迷宫(AC,DFS)
- 递归的全排列(耗时比较长)
- acm--字符串比较
- acm--等长字符串排序(头都大了...)
- acm--不等长字符串排序(指向指针的指针)
- ACM--递归效率的比较
- 递归遍历目录代码
- 二叉树的遍历(代码递归和数据递归)
- ACM--HDOJ 2024--C语言合法标识符--字符串
- 九度笔记之 1342:寻找最长合法括号序列II(25分)-给括号当红娘,解决最长合法字符串问题
- MySQL存储过程-->长字符串扯分
- MySQL存储过程-->长字符串扯分
- OpenGL 放大器(Cocos2d magnifier)
- 正则表达式30分钟入门教程
- M2_REPO介绍
- 将maven2项目转换为myeclipse项目
- MongoDB备份数据的压缩存储
- ACM水题-合法字符串 (AC,递归遍历,分情况,代码比较长)
- vs 2010 style 配色方案
- VC菜菜鸟:基于CFree的HelloWorld程序
- SQL server 之 触发器
- 提示音
- error: ‘for’ loop initial declarations are only allowed in C99 mode
- Maven2基础介绍
- 自定义对话框(Dialog)位置,大小
- shell编程一