题解 | #密码截取#

密码截取

https://www.nowcoder.com/practice/3cd4621963e8454594f00199f4536bb1

dp
A B B A

i    j 0 1 2 3
A 0 true false false true
B 1
true true false
B 2

true false
A 3


true
//bool dp[i][j]为从i到j的字符串是否回文,右上三角矩阵
//1个字符和相邻相同双字符就是回文,初始化可以先判断填上去,对角线2行填完
//从右下角,从下往上,从左往右。dp[i][j]=dp[i+1][j-1]&&s[i]==s[j];

1    初始化

(1)单字符回文,对角线全部填true
(2)//相邻相同双字符就是回文,初始化可以先判断填上去,对角线2行填完

2    从右下角,从下往上,从左往右。

dp[i][j]=dp[i+1][j-1]&&s[i]==s[j];

#include <bits/stdc++.h>
using namespace std;  int main(){
    string s;
    cin>>s;
    int n=s.size(),res=1;    //res为最终结果,填矩阵时不断更新
    bool **dp=new bool*[n];    //bool dp[i][j]为从i到j的字符串是否回文,右上三角矩阵
    for(int i=0;i<n;i++){
        dp[i]=new bool[n]{0};
        dp[i][i]=1;    //单字符回文
        if(i&&s[i-1]==s[i]){
            dp[i-1][i]=1;    //相邻相同双字符就是回文,初始化可以先判断填上去,对角线2行填完
            if(res!=2){
                res=2;    //更新res
            }
        }
    }
    for(int i=n-3;i>=0;i--){    //从右下角,从下到上
        for(int j=i+2;j<n;j++){    //从左到右
            dp[i][j]=dp[i+1][j-1]&&s[i]==s[j];
            if(dp[i][j]&&res<j-i+1){
                res=j-i+1;    //更新res
            }
        }
    }
    cout<<res;
}


#华为笔试#
全部评论

相关推荐

科大讯飞消费者bg二级研究院 语音算法岗 24k*14
点赞 评论 收藏
转发
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务