[LeetCode] 5. Longest Palindromic Substring

思路一:
动态规划. 创立一个表格flag, 长与宽都为字符串s的长度. 表格flag中的每一项flag[i][j]都表示子字符串s[i]到s[j]是否是回文串. 主要工作就是填充这个表格.
首先是初始化工作, 将这个矩阵的下半个三角部分, 包括对角线都初始化为true, 对角线为真的原因是当i == j的时候, s[i] == s[j], 一个字母本身一定是回文串. 剩下的部分就是当i > j的时候, 此时设置为真是当s中有相邻的两个相同的字符或者两个相同字符中间只间隔着一个字符时, 由于对于每个flag[i][j], 我们都要看flag[i + 1][j - 1]的结果, 如果i和j相连, i + 1 > j - 1, 而只要遇到这种情况时, s[i]到s[j]一定是回文串, 所以一定会是真.
唯一需要考虑的就是i < j的情况, 如果s[i] == s[j]并且i < j, 那么我们就要把flag[i + 1][j - 1]的结果放到flag[i][j]中, 然后再比较更新start和maxlen的数据.

string longestPalindrome(string s) {
    int len = s.length(), start = 0, maxlen = 1;
    int flag[len][len] = {0};
    for (int i = 0; i < len; i++) {
        for (int j = 0; j < len; j++) {
            if (i >= j)
                flag[i][j] = true;
            else
                flag[i][j] = false;
        }
    }
    for (int j = 1; j < len; j++) {
        for (int i = 0; i < j; i++) {
            if (s[i] == s[j]) {
                flag[i][j] = flag[i + 1][j - 1];
                if (flag[i][j] && j - i + 1 > maxlen) {
                    maxlen = j - i + 1;
                    start = i;
                }
                else
                    flag[i][j] = false;
            }
        }
    }
    return s.substr(start, maxlen);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值