這是一個典型問題KMP申請書。
結果求增加兩個字符串。該法的總和是相同的前綴和后綴也是字符串的字符串,您將可以合并本節。
但是,這個問題是不是問題非常明確的含義,因為不是太清楚,外觀這兩個字符串的順序無關緊要,后只需要輸出的最短的組合長度的結果,并后長度一樣,那么就依照字典順序,輸出字典順序在前的字符串。
思路:
1 使用kmp在s2查找s1,那么終于結束的時候next table的值就是s1前綴和s2的后綴同樣的最長的長度了。
2 輸入兩個字符串s1和s2。那么就能夠在s2中查找s1。得到長度len1,s1中查找s2,得到長度len2,比較len1和len2的長短,就能夠確定輸出哪個字符串了。
const int MAX_N = (int)1E5 + 1;
char s1[MAX_N], s2[MAX_N];
int L1, L2, nxt[MAX_N];void genTbl(char *str, int len)
{memset(nxt, 0, sizeof(int) * len);//又一個忘記清零錯誤for (int i = 1, j = 0; i < len; ){if (str[i] == str[j]) nxt[i++] = ++j;else if (j > 0) j = nxt[j-1];else i++;//不清零,也能夠nxt[i++] = 0;前面寫nxt[0] = 0;}
}void getLongestPreSuf(int &j, char *str1, char *str2, int len1, int len2)
{genTbl(str1, len1);j = 0;int i = 0;for (; i < len2; ){if (str2[i] == str1[j]) i++, j++;else if (j > 0) j = nxt[j-1];else i++;}
}void printStr(char *str1, char *str2, int l1, int l2, int len)
{for (int i = 0; i < l1; i++) putchar(str1[i]);for (int i = len; i < l2; i++) putchar(str2[i]);putchar('\n');
}int main()
{while (scanf("%s", s1) != EOF){scanf("%s", s2);L1 = strlen(s1);L2 = strlen(s2);int len1 = 0, len2 = 0;getLongestPreSuf(len1, s1, s2, L1, L2);getLongestPreSuf(len2, s2, s1, L2, L1);if (len1 < len2){//printStr(s1, s2, L1, L2, len2);printf("%s%s\n", s1, s2+len2);}else if (len2 < len1){//printStr(s2, s1, L2, L1, len1);printf("%s%s\n", s2, s1+len1);}else{//if (strcmp(s1, s2) < 0) printStr(s1, s2, L1, L2, len2);//else printStr(s2, s1, L2, L1, len1);if (strcmp(s1, s2) < 0) printf("%s%s\n", s1, s2+len2);else printf("%s%s\n", s2, s1+len1);}}return 0;
}
版權聲明:筆者靖心臟。景空間地址:http://blog.csdn.net/kenden23/。只有經過作者同意轉載。
總結
以上是生活随笔為你收集整理的HDU 1867 A + B for you again KMP解决问题的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。