最长公共子串&动态规划
递推公式:
如果a[i] == a[j], 那么dp[i][j] = dp[i-1][j-1] + 1; 否则 dp[i][j] = 0;
#include <iostream>
using namespace std;
int lcs(string a, string b)
{
int maxLen = 0;
a.insert(0, 1, ' ');//string类中的函数
b.insert(0, 1, ' ');//加一行空格,是[i-1][j-1]上索引有个起点定位,从0开始+1
int n = a.size(), m = b.size();
int dp[n][m];
for(int i = 0; i < n; i++) dp[i][0] = 0;
for(int j = 0; j < m; j++) dp[0][j] = 0;
for(int i = 1; i < n; i++) //一定是从1开始,因为0的外圈已经被定义完了
{
for(int j = 1; j < m; j++)
{
if(a[i] == b[j]) {
dp[i][j] = dp[i-1][j-1] + 1;
maxLen = max(maxLen, dp[i][j]);
} else {
dp[i][j] = 0;
}
}
}
return maxLen;
}
int main()
{
string a, b;
while(cin >> a >> b)
{
cout << lcs(a, b) << endl;
}
return 0;
}
insert函数:
string str="hello";
str.insert(1,s);//在原串下标为1的字符e前插入字符串s
str1.insert(4,5,c);//在原串下标为4的字符o前插入5个字符c
string s2="weakhaha";
str2.insert(0,s2,1,3);//将字符串s2从下标为1的e开始数3个字符,分别是eak,插入原串的下标为0的字符h前
同类对比习题:最长公共子序列
str1=“123ABCD456” str2 = “ABE12345D”
最长公共子串是:123
最长公共子序列是:12345
这两个都可以用动态规划,只是状态转移方程有点区别:
公共子串的核心
for (int i=0;i<a;i++){
for(int j=0;j<b;j++){
if(str1[i]==str2[j])
dp[i][j]=dp[i-1][j-1]+1;
else dp[i][j]=0;
}
}
公共子序列的核心
for(int i=1;i<=len1;i++){
for(int j=1;j<=len2;j++){
if(str1.charAt(i-1) == str2.charAt(j-1)){
dp[i][j] = dp[i-1][j-1] + 1;
}else{
dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]); //区别在这儿
}
}
}
查找大写字母
#include<iostream>
#include<string>
using namespace std;
int main(){
string a;
while(getline(cin,a)){
char b;
int num=0;
for(int i=0;i<a.size();i++){
b=a[i];
if(isupper(b))//大写则输出非0
num+=1;
}
cout<<num<<endl;
}
return 0;
}
isupper()大写字母判断;
islower()小写字母判断;
isalpha()字母判断;
isalnum()字母和数字判断。
另外由于字母按顺序存放
#include<iostream>
#include<string>
using namespace std;
int main(){
string a;
while(getline(cin,a)){
char b;
int num=0;
for(int i=0;i<a.size();i++){
b=a[i];
if(b>'A'&&b<'Z')
num+=1;
}
cout<<num<<endl;
}
return 0;
}