考察,找几个字符串的最小公共子串
learn && wrong;
1、果然找最小,还是得循环
2、如何比较几个子串的公共最小子串是个问题!
取第一个字符串的第一个字符出来,然后枚举所有的字符串(for),比较是否一样,一样则第一个字符串的下一个,不一样则break
以一个flag标记,如果flag没改变,就int ans ++(还有个else_break双重break),最后判断ans的值是多少,然后输出!
3、reversize()是算法库而不是string的函数?string没有这个函数,而是<algorithnm>,或者<cstring>中的,strrev()函数
4、我少了这个,特别注意,重大问题:输入一个数字,接下来连续好几场的串,必须用getchar()吸收空格!
5、循环老是写错,i,j不分
6、scanf+%s和gets是不同的,前者以空格为截断,后者以换行符为截断
/*
编程思想:
1、输入个数,并且用字符数组把它们存起来?
2、将它们反转
3、找出最小长度的那个,然后枚举相同的个数,最后输出即可,如果长度为0.则数nai
反转,
然后按行输入string
枚举[][]
*/
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
string str[110];
int main()
{
int num;
cin >> num;
getchar();
//!!!我少了这个,特别注意,重大问题
for (int i = 0; i < num;i++) { //逐行输入
getline(cin, str[i],'\n');
}
for (int i = 0;i < num;i++) { //逐个反转
reverse(str[i].begin(), str[i].end());
}
int min_num = 257; //怎么找出最小长度那个,肯定有办法,循环吗,
for (int i = 0;i < num;i++) {
if (str[i].size() < min_num) {
min_num = str[i].size();
}
}
//如何找到共同的子串,是三个一起比较吗,还是两个两个比较?我懵了,第二个样例,是要三个一起比较的
//主要是我不知道num是多少呀,只能是数字呀,这个不定,肯定是数组,那怎么一起比较呢,两个两个来?
/*!!!我知道了,太强了,取第一个字符串的第一个字符出来,然后枚举所有的字符串,比较是否一样,一样则第一个字符串的下一个,不一样则break
以一个flag标记,如果flag没改变,就int ans ++;最后判断ans的值是多少,然后输出!
*/
int ans = 0;
for (int i = 0;i < min_num;++i) { //枚举最小串
char c = str[0][i];
bool flag = true;
for (int j = 1; j < num;j++) { //几个字符逐一比较
if (c != str[j][i]) //如果不同則break,如果相同則ans++,最後輸出即可 //!!!这里错在了!错在了那个,里面有个内层循环,ans第一个字符了,而是N个数组N个ans了,所以还是得标准答案!以一个flag记录全部子串的第一个,然后以flag判断是不是要加
{ //j 写成了i!!!
flag = false;
break;
}
}
if (flag) ++ans;
else break; //!!!记得这里还有个else break;
}
if (ans == 0) cout << "nai" << endl;
else {
for (int i = ans - 1; i >= 0;--i) { //i >= 0,写成了ans>=0,越界了
cout << str[0][i];
}
}
return 0;
}
网友评论