ACM水題--字串的字首和字尾
阿新 • • 發佈:2019-02-18
字串的字首和字尾 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) ; }