查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。(一种特别的双重循环思想)

    科技2022-08-14  101

    思路解析: 因为是要输出在较短字符串中公共字符串最长的字段,而且是最先出现的那个。 所以,我们可以采用暴力匹配的思想,但是有个技巧,就是从针对较短的那个字段而言,将它按照从长到短的顺序逐个分离出来。 比如字符串的长度为10,那么我们就按照长度分别为10、9、8…2、1的情况来暴力匹配。由于是从长到短来匹配,因此当第一次匹配成功,即是答案。 特殊的双层循环: 假设字符串长度为10的s[10];那么逐渐遍历的字段为: s(0,9)//第一次匹配 s(0,8)、s(1,9)//第二次匹配 s(0,7)、s(1,8)、s(2,9)//第二次匹配 … 外循环中控制字段的长度; 内循环中控制字段的首字母;

    #include<iostream> #include<string> using namespace std; int main() { string a, b; while (cin >> a >> b) { int len1 = a.length(); int len2 = b.length(); if (len1 >= len2)//判断两个字符串的长短,对短字符串进行处理 { for (int i = len2; i >= 0; i--)//外循环,控制匹配字段的长度 { int d = 0; for (int j = 0; j <= len2 - i; j++)//内循环,控制字段的起始位置 { string temp = b.substr(j, i); if (a.find(temp)!=string::npos) { cout << temp << endl; d = 1;//控制结束外循环 break; } } if (d == 1) break; } } if (len1 <= len2)//判断两个字符串的长短,对短字符串进行处理 { for (int i = len1; i >= 0; i--) { int d = 0; for (int j = 0; j <= len1 - i; j++) { string temp = a.substr(j, i); if (b.find(temp) != string::npos) { cout << temp << endl; d = 1; break; } } if (d == 1) break; } } } }
    Processed: 0.017, SQL: 8