• [Leetcode]647.Palindromic Substrings


    链接:LeetCode647

    给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。

    具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串。

    示例 1:

    输入: "abc"
    输出: 3
    解释: 三个回文子串: "a", "b", "c".
    示例 2:

    输入: "aaa"
    输出: 6
    说明: 6个回文子串: "a", "a", "a", "aa", "aa", "aaa".

    相关标签:动态规划

    一道明显的动态规划题。令dp[i][j]表示字符串索引i-j是否能组成回文,一共有三种情况:

    • 当i==j,此时为单个字符,必成回文
    • 当i==j-1,此时为两个字符,只需要判断这两个是否相同即可
    • 其他,此时采用动态规划,dp[i][j] = dp[i+1][j-1] & (s[i] == s[j])
      代码如下:

    python:

    class Solution:
        def countSubstrings(self, s: str) -> int:
            res = 0
            if not s:
                return res
            n = len(s)
            dp = [[False for j in range(n)] for i in range(n)]
            for i in reversed(range(n)):
                for j in range(i,n):
                    if i == j:
                        dp[i][j] = True
                    elif i == j-1:
                        dp[i][j] = (s[i] == s[j])
                    elif s[i] == s[j]:
                        dp[i][j] = dp[i+1][j-1]
                    if dp[i][j]:
                        res += 1
            return res
    

    C++:

    class Solution {
    public:
        int countSubstrings(string s) {
            if(s.empty()) return 0;
            int n = s.size(),res = 0;
            vector<vector<bool>> dp(n,vector<bool>(n));
            for (int i=n-1;i>=0;i--){
                for (int j=i;j<n;j++){
                    dp[i][j] = (s[i] == s[j]) && (i==j || i==j-1 || dp[i+1][j-1]);
                    if(dp[i][j]) ++ res;
                }
            }
            return res;
        }
    };
    
  • 相关阅读:
    arcgis9.3 执行python文件
    python定义影像投影
    要素缩放闪烁功能
    C# Math.Round中国式的四舍五入法
    Eziriz.Net.Reactor使用注意事项
    c# datagridview表格控件常用操作
    主窗口通用泛型打开不同子窗口
    arcgis for android 无法加载本地jpg影像解决办法
    多边形修边算法
    【笔记】Python3导入包规则
  • 原文地址:https://www.cnblogs.com/hellojamest/p/12229851.html
Copyright © 2020-2023  润新知