1. 查找两个字符串a,b中的最长公共子串(65)
描述:
查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。注:子串的定义:将一个字符串删去前缀和后缀(也可以不删)形成的字符串。请和“子序列”的概念分开!
输入描述:
输入两个字符串
输出描述:
返回重复出现的字符
#include <iostream>
using namespace std;
int main(void)
{
string str1, str2;
while(cin >> str1 >> str2) {
if(str1.size() > str2.size()) {
swap(str1, str2);
}
int maxLen = 0;
int pos = 0;
for(int i = 0; i < str1.size(); i++) {
for(int j = 0; j < str2.size(); j++) {
int a = i, b = j;
int Len = 0;
while(str1[a] == str2[b]) {
a++, b++;
Len++;
if(a == str1.size() || b == str2.size())
break;
}
if(Len > maxLen) {
maxLen = Len;
pos = i;
}
}
}
cout << str1.substr(pos, maxLen) << endl;
}
return 0;
}
2. 公共子串计算(75)
描述:
给定两个只包含小写字母的字符串,计算两个字符串的最大公共子串的长度。注:子串的定义指一个字符串删掉其部分前缀和后缀(也可以不删)后形成的字符串。
输入描述:
输入两个只包含小写字母的字符串
输出描述:
输出一个整数,代表最大公共子串的长度
#include <iostream>
#include <algorithm>
using namespace std;
int main(void)
{
string str1, str2;
while(cin >> str1 >> str2) {
if(str1.size() > str2.size())
swap(str1, str2);
int maxlen = 0;
for(int i = 0; i < str1.size(); i++)
for(int j = 0; j < str2.size(); j++) {
int a = i, b = j;
int len = 0;
while(str1[a] == str2[b]) {
a++, b++;
len++;
if(a == str1.size() || b == str2.size())
break;
}
if(maxlen < len)
maxlen = len;
}
cout << maxlen << endl;
}
return 0;
}
#include <iostream>
#include <string>
using namespace std;
string LCS(string str1, string str2) {
int dp[100][100] = {0};
int maxLen = 0;
int maxIndex = 0;
for (int i = 0; i < str1.length(); i++) {
for (int j = 0; j < str2.length(); j++) {
if (str1[i] == str2[j]) {
dp[i + 1][j + 1] = dp[i][j] + 1;
if (dp[i + 1][j + 1] > maxLen) {
maxLen = dp[i + 1][j + 1];
maxIndex = i;
}
} else {
dp[i+1][j+1] = 0;
}
}
}
return str1.substr(maxIndex-maxLen+1, maxLen);
}
int main()
{
string str1 = "1AB2345CD";
string str2 = "12345EF";
string out;
out = LCS(str1, str2);
cout << out << endl;
system("pause");
return 0;
}
3. 最长回文子串(85)
描述:
给定一个仅包含小写字母的字符串,求它的最长回文子串的长度。
输入描述:
输入一个仅包含小写字母的字符串
输出描述:
返回最长回文子串的长度
#include <iostream>
using namespace std;
int HuiWen(string str, int left, int right) {
while(right >= 0 && left < str.length() && str[left] == str[right]) {
left++;
right--;
}
return left - right - 1;
}
int main(void)
{
string str;
while(cin >> str) {
int len = str.length();
int max = 0;
for(int i = 0; i < len; i++) {
int len1 = HuiWen(str, i, i);
int len2 = HuiWen(str, i, i+1);
if(len1 > max)
max = len1;
if(len2 > max)
max = len2;
}
cout << max << endl;
}
return 0;
}
4. 滑动窗口解最小覆盖子串
描述:
给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串 。如 果 s 中不存在涵盖t所有字符的子串,则返回空字符串" "。
输入描述:
s = " A D O B E C O D E B A N C " , t = " A B C "
输出描述:
" B A N C "
public String minWindow(String s, String t) {
int[] map = new int[128];
//记录字符串t中每个字符的数量
for (char ch : t.toCharArray())
map[ch]++;
//字符串t的数量
int count = t.length();
int left = 0;//窗口的左边界
int right = 0;//窗口的右边界
//覆盖t的最小长度
int windowLength = Integer.MAX_VALUE;
//覆盖字符串t开始的位置
int strStart = 0;
while (right < s.length()) {
if (map[s.charAt(right++)]-- > 0)
count--;
//如果全部覆盖
while (count == 0) {
//如果有更小的窗口就记录更小的窗口
if (right - l