From e9274b0a6ba153bbafd5a82d9a37a94d0e8a7147 Mon Sep 17 00:00:00 2001 From: ZhaoJianyu-trhy <741766685@qq.com> Date: Mon, 17 May 2021 22:39:54 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A00647=E5=9B=9E=E6=96=87?= =?UTF-8?q?=E5=AD=97=E4=B8=B2=20Java=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0647.回文子串.md | 61 ++++++++++++++++++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/problems/0647.回文子串.md b/problems/0647.回文子串.md index 45bb72be..bfc52502 100644 --- a/problems/0647.回文子串.md +++ b/problems/0647.回文子串.md @@ -219,9 +219,68 @@ public: ## 其他语言版本 - Java: +动态规划: + +```java +class Solution { + public int countSubstrings(String s) { + int len, ans = 0; + if (s == null || (len = s.length()) < 1) return 0; + //dp[i][j]:s字符串下标i到下标j的字串是否是一个回文串,即s[i, j] + boolean[][] dp = new boolean[len][len]; + for (int j = 0; j < len; j++) { + for (int i = 0; i <= j; i++) { + //当两端字母一样时,才可以两端收缩进一步判断 + if (s.charAt(i) == s.charAt(j)) { + //i++,j--,即两端收缩之后i,j指针指向同一个字符或者i超过j了,必然是一个回文串 + if (j - i < 3) { + dp[i][j] = true; + } else { + //否则通过收缩之后的字串判断 + dp[i][j] = dp[i + 1][j - 1]; + } + } else {//两端字符不一样,不是回文串 + dp[i][j] = false; + } + } + } + //遍历每一个字串,统计回文串个数 + for (int i = 0; i < len; i++) { + for (int j = 0; j < len; j++) { + if (dp[i][j]) ans++; + } + } + return ans; + } +} +``` + +中心扩散法: + +```java +class Solution { + public int countSubstrings(String s) { + int len, ans = 0; + if (s == null || (len = s.length()) < 1) return 0; + //总共有2 * len - 1个中心点 + for (int i = 0; i < 2 * len - 1; i++) { + //通过遍历每个回文中心,向两边扩散,并判断是否回文字串 + //有两种情况,left == right,right = left + 1,这两种回文中心是不一样的 + int left = i / 2, right = left + i % 2; + while (left >= 0 && right < len && s.charAt(left) == s.charAt(right)) { + //如果当前是一个回文串,则记录数量 + ans++; + left--; + right++; + } + } + return ans; + } +} +``` + Python: