动态规划&查找字母

最长公共子串&动态规划

递推公式:
如果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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值