两个子串
两个子串
http://www.nowcoder.com/questionTerminal/abf0f0d6b4c44676b44e66060286c45a
题解
难度:简单
知识点:字符串
整道题主要考察的就是字符串的知识和一些字符串函数,整体思路比较简单。现提供两种算法思路来解决问题。
解题思路:因为要求输出的字符串要含有两个输入的字符子串,并且要求是最短的,那肯定是重复的部分越多越好,这样整个字符串就会越短。所以越早发现重复部分,结果越短。
方法一:
使用for循环,检查一下子从什么flag位置开始,后面的所有字符都可以从头匹配得到,此时这个位置的就是最近的,组合得到的字符即是最短的。
#include<iostream> #include<string> using namespace std; int main() { string str; cin>>str; int len=str.size(); int flag = 0; for(int i=1;i<len;i++) { int k=i; for(int j=0;j<len;j++) { if(str[j]==str[k]) { k++; } else { break; } if(k==len) { flag=i; break; } } if(flag) break; } if(flag) { for(int i=0;i<flag;i++) { cout<<str[i]; } cout<<str<<endl; } else cout<<str<<str<<endl; return 0; }
方法二
因为拼合成的字符含有两个输入的子字符串,所以加入我们用两个这个字符串拼成一个字符,然后将不重合的部分删除掉即可以找到最多的相同部分,然后再在两个相同字符串的基础上删除掉这部分,即可得到所求的字符串。但是如何删除呢?此时就可以联想到,一个是需要重头部开始删除,另一个则从尾删除,直到剩下的部分相同为止。
#include <iostream> #include <string> using namespace std; string eraseMore(string str) { string str1(str),str2(str),str3(str); int length=str.length(); int i=1; for( i; i<length; i++) { str1.erase(0,1); str2.erase(str2.length()-1,1); if(str1==str2) break; } return str+str3.erase(0,str3.length()-i); } int main() { string str; cin>>str; cout << eraseMore(str)<< endl; return 0; }