字符串的前缀和后缀 Time Limit:1000MS Memory Limit:65536K Total Submit:81 Accepted:22 Description 字符串的前缀是指字符串的任意首部。比如字符串“abbc”的前缀有“a”,“ab”,“abb”,“abbc”。同样,字符串的任意尾部是字符串的后缀,“abbc”的后缀有“c”,“bc”,“bbc”,“abbc”。现在给出一些字符串, 找出每个字符串中含字符种类最多的前缀或后缀。 Input 输入第一行是一个整数n(1<=n<=50),表示有n个字符串。 下面有n行,每行的格式是这样:字符串str 字符ch 字符串str由小写字母组成,长度不超过100000,字符ch只有两个取值’P’,’S’。 如果ch为’P’,则找出含字符种类最多的前缀。如果ch为’S’,则找出含字符种类最多的后缀。 Output 对于每个字符串,输出一行。 输出格式是这样:String #X: Y 按字符串的读入顺序,X从1开始递增到n。 Y是满足条件的前缀字符串或后缀字符串, 如果有多个前缀或后缀满足条件,则取长度最小的一个。 Sample Input 3 abbc P kaaaaaaaaaa P nlogn S Sample Output String #1: abbc String #2: ka String #3: logn Source cxyue
/* ----------------------------------------------------------------------------------- 大概想法: 举例: 情景:当选择为P时 思路:1.字符串头尾各设一个指针,将两个指针所指向的值作比较,直到两个指针所针的地址相同 2.若头指针所指的字符与尾指针相等,则尾指针向前移一位,头指针重置为第一位,重复1 3.若头指针所指的字符与尾指针不相等,则头指针向前移一位,重复1 结果: Accept,时间15MS.......太弱了.......不过,自己还是没有想到可以更快的方法. ----------------------------------------------------------------------------------- */ #include<stdio.h> #include<string.h> void Find(char *szStr, int n, char choice) ; char szInputStr[100000] ; int main(void) { int i = 1 ; int t = 0 ; char chChoice = 0 ; scanf("%d",&t) ; while(getchar() != '\n') { continue ; } while(t-- > 0) { scanf("%s %c",szInputStr,&chChoice) ; Find(szInputStr,i++,chChoice) ; } return 0 ; } void Find(char *szStr , int n, char choice) { char *pszBeg = szStr ; char *pszEnd = szStr + strlen(szStr) - 1 ; char szOutputStr[1000] ; char *pEndPos = pszEnd ; char *pBegPos = pszBeg ; int iLen = strlen(szStr) ; if('P' == choice) { while(pszBeg != pszEnd) { if(*pszBeg == *pszEnd) { pszEnd-- ; pEndPos = pszEnd ; pszBeg = szStr ; } else { pszBeg++ ; } } iLen = pEndPos - szStr + 1 ; strncpy(szOutputStr, szStr, iLen) ; szOutputStr[iLen] = '\0' ; } else if('S' == choice) { while(pszBeg != pszEnd) { if(*pszBeg == *pszEnd) { pszBeg++ ; pBegPos = pszBeg ; pszEnd = szStr + iLen - 1 ; } else { pszEnd-- ; } } pszEnd = szStr + iLen - 1 ; iLen = pszEnd - pBegPos + 1 ; strncpy(szOutputStr, pBegPos, iLen) ; szOutputStr[iLen] = '\0' ; } printf("String #%d: %s\n",n,szOutputStr) ; }