个人名片:
作者简介:一名大二在校生,热爱生活,爱好敲码!
\ 个人主页 :holy-wangle
➡系列内容: ️ tkinter前端窗口界面创建与优化
️ Java实现ATP小系统
✨个性签名: 不积跬步,无以至千里;不积小流,无以成江海
今天的算法也是关于字符串!
下面看看我们的题目是什么。
最长回文子串
题目:给你一个字符串 s
,找到 s
中最长的回文子串。如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
提示:
1 <= s.length <= 1000
s
仅由数字和英文字母组成
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd"
输出:"bb"
从题目来看,求最长回文子串,回文字串就是从当前字母正序读和到最后一个字母逆序读的结果都一样,eg:”abba“, 正序:abba 逆序:abba
思路:中心扩散法
从每一个位置出发,向两边扩散即可。遇到不是回文的时候结束。举个例子,
str=acdbbdaa 我们需要寻找从第一个 b(位置为 3)出发最长回文串为多少。怎么寻找?
首先往左寻找与当期位置相同的字符,直到遇到不相等为止。
然后往右寻找与当期位置相同的字符,直到遇到不相等为止。最后左右双向扩散,直到左和右不相等。
java代码实现:
class work {
String longestPalindrome(String s) {
if (s == null || s.length() == 0) {
return "";
}
int strLen = s.length(); //获取字符串长度
int left = 0; // 定义left指针
int right = 0; // 定义right指针
int len = 1; //定义初始化变量
int maxStart = 0;
int maxLen = 0;
// 求回文子串
for (int i = 0; i < strLen; i++) {
// 每次循环读重置一次
left = i - 1;
right = i + 1;
// 判断左边的值是否与当前的值相等
while (left >= 0 && s.charAt(left) == s.charAt(i)) {
len++;
left--;
}
// 判断右边的值是否与当前的值相等
while (right < strLen && s.charAt(right) == s.charAt(i)) {
len++;
right++;
}
// 判断左右变量的值是否相等
while (left >= 0 && right < strLen && s.charAt(right) == s.charAt(left)) {
len = len + 2;
left--;
right++;
}
// 保存最大的那个回文子串的长度
if (len > maxLen) {
maxLen = len;
maxStart = left;
}
len = 1;
}
// 返回回文子串
return s.substring(maxStart + 1, maxStart + maxLen + 1);
}
}
public class Lcode_3 {
public static void main(String[] args) {
work w = new work();
System.out.println(w.longestPalindrome("aaaa"));
}
}
感谢各位的观看,创作不易,能不能给哥们来一个点赞呢!!!
好了,今天的分享就这么多了,有什么不清楚或者我写错的地方,请多多指教!
私信,评论我呗!!!!!!
关注我下一篇不迷路哦!