思路
题目
代码
class Solution {
public int countSubstrings(String s) {
int result = 0;
for(int center = 0; center < s.length()* 2 - 1; center ++){
int left = center/2;
int right = left + center%2;
while(left>=0 && right<s.length() && s.charAt(left) == s.charAt(right)){
result++;
left--;
right++;
}
}
return result;
}
}
最长回文子串的两种解法
动态规划
class Solution {
public String longestPalindrome(String s_) {
if (s_.length() < 2) { // 要排除异常情况 因为给定了(1 <= s.length <= 1000)
return s_;
}
char[] s = s_.toCharArray(); // 不知道为甚么 用数组更快
int len = s.length;
// dp[l][r] = true; : dp数组的意义是 从下标 l到下标 r 的字符串是回文子串
boolean[][] dp = new boolean[len][len]; // dp 是 boolean数组
int maxLen = 0; // 回文子串的最长长度 , 实时更新
int maxL = 0; // 最长回文子串的起点
int maxR = 0; // 最长回文子串的终点
for(int r = 1; r < len ; r++){
for(int l = 0; l < r ; l++){
if(s[l] == s[r] && (dp[l+1][r-1] || r-l <= 2)){ // 动归转移方程 以及 相应的条件
dp[l][r] = true; // (r-1)-(l+1)<=0) 等价于 (r+1)-l<=3,即字符串长度小于3,这时候只要端点字符相等,就是回文串
if(r - l + 1 > maxLen){
maxLen = r -l + 1 ;
maxL = l;
maxR = r;
}
}
}
}
return s_.substring(maxL,maxR+1); // substring() 函数 剪切范围 包括左端,不包括右端
}
}
中心扩散法
class Solution {
public String longestPalindrome(String s_) {
String result = "";
for(int center = 0; center < s_.length() * 2 - 1; center++){
int left = center/2;
int right = left +center%2;
while(left>=0 && right<s_.length() && s_.charAt(left) == s_.charAt(right)){
if(right-left+1 > result.length()){
result = s_.substring(left,right+1);
}
left--;//不要写成left++了
right++;
}
}
return result;
}
}
// @solution-sync:end
class Main {
public static void main(String[] args) {
String s = "babad";
String result = new Solution().longestPalindrome(s);
System.out.println(result);
}
}