647. 回文子串-day51
思路和算法这道题要求计算字符串 s 的回文子串的数目即计算字符串 s 中的回文区间的数目。用 n 表示字符串 s 的长度。对于 0≤ijn 且 j−i2区间 [i,j] 和区间 [i1,j−1] 的中心位置相同如果满足 s[i]s[j] 且区间 [i1,j−1] 是回文区间则区间 [i,j] 也是回文区间否则区间 [i,j] 不是回文区间。可以使用动态规划计算每个区间是否为回文区间并计算回文子串的数目。创建 n×n 的二维数组 dp其中 dp[i][j] 表示区间 [i,j] 是否为回文区间。对于长度为 1 或 2 的区间可以直接判断是否为回文区间因此动态规划的边界情况如下。当 ji 时区间长度为 1一定是回文区间因此对于任意 0≤indp[i][i]true。当 j−i1 时区间长度为 2如果两个字符相等则是回文区间如果两个字符不相等则不是回文区间因此对于任意 0≤in−1如果 s[i]s[i1] 则 dp[i][i1]true如果 s[i]s[i1] 则 dp[i][i1]false。当 j−i1 时区间长度至少为 3去掉区间 [i,j] 的首尾字符之后剩余的区间 [i1,j−1] 非空可以根据 s[i] 是否等于 s[j] 和区间 [i1,j−1] 是否为回文区间判断区间 [i,j] 是否为回文区间。因此动态规划的状态转移方程是 dp[i][j](s[i]s[j])∧dp[i1][j−1]。根据动态规划的状态转移方程计算 dp[i][j] 需要使用 dp[i1][j−1] 的值即区间 [i1,j−1] 的状态值需要在区间 [i,j] 的状态值之前计算。由于区间 [i1,j−1] 和区间 [i,j] 相比区间长度更小且区间开始下标更大因此计算 dp[i][j] 的顺序可以是以下两种。从小到大遍历每个区间长度对于每个区间长度依次计算每个区间的状态值。从大到小遍历每个区间开始下标 i对于每个区间开始下标 i 从小到大遍历每个区间结束下标 j依次计算每个区间 [i,j] 的状态值。计算过程中需要维护回文子串的数目计算得到动态规划的所有状态值之后即可得到字符串 s 的回文子串的数目。代码下面的代码为按照区间长度递增顺序计算的实现。class Solution { public int countSubstrings(String s) { int count 0; int n s.length(); boolean[][] dp new boolean[n][n]; for (int i 0; i n; i) { dp[i][i] true; count; } for (int i 0; i n - 1; i) { dp[i][i 1] s.charAt(i) s.charAt(i 1); if (dp[i][i 1]) { count; } } for (int subLength 3; subLength n; subLength) { for (int i 0, j subLength - 1; j n; i, j) { if (s.charAt(i) s.charAt(j) dp[i 1][j - 1]) { dp[i][j] true; count; } } } return count; } }
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2427947.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!