Algorithm 做一道leetcode算法题
题目
- 最长回文子串
给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
示例 2:
输入:s = “cbbd”
输出:“bb”
示例 3:
输入:s = “a”
输出:“a”
示例 4:
输入:s = “ac”
输出:“a”
提示:
1 <= s.length <= 1000
s 仅由数字和英文字母(大写和/或小写)组成
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring/
解题思路
有个神奇的东西,叫做正则表达式,然后我在网上查了一下正则表达式,发现,正则表达可以匹配回文字符串。
class Solution {
public String longestPalindrome(String s) {
//如果长度为一直接返回
if(s.length() == 1) return s;
//使用正则表达式
Pattern p = Pattern.compile("(.*).?\\1");
Matcher m = p.matcher(s));
String str = "";
//匹配所有匹配的字符串,找到最长的字符串
while(m.find()) {
String mStr = m.group();
if(mStr.length() > str)
}
//返回结果
return str;
}
}
结果,执行报错。不能用正则表达式,真是太遗憾了。
不是说这个代码有问题,只是leetcode不能用正则而已。
没办法,只好换一种思路了
然后,我就想了一个办法,我先假设,最大回文字符串长度为整个字符串,然后逐渐的减小长度,再去检验,一旦找到符合结果的,立马返回,得到的就是最大回文字符串了。
class Solution {
public String longestPalindrome(String s) {
int len = s.length();
int strLen = len;
String str = null;
while(str == null) {
int center = len / 2;
for(int i = 0; i + len <= strLen; i++) {
String left = s.substring(i,center + i);
String right = s.substring(center + i + len%2,i + len);
boolean t = true;
for(int j = 0;j < center;j++) {
t=left.charAt(j)==right.charAt(center - j - 1);
if (!t) {
break;
}
}
if(!t) continue;
str = s.substring(i,i + len);
break;
}
len--;
}
return str;
}
}
执行效率比较低。我也翻了一下官方题解,感觉都看不明白,脑壳痛。
还有优化空间,不截取字符串,直接在原字符串上用charAt 来比较
boolean t = true;
for(int j = 0;j < center;j++) {
t=s.charAt(j + i)==s.charAt(i + len - j - 1);
if (!t) {
break;
}
}
运行时间大幅的提升
Review 阅读并点评至少一篇英文技术文章
Tips 学习至少一个技术技巧
mysql find_in_set
最近在工作中发现一个mysql的有趣的函数。
这个函数可以匹配逗号隔开的数组
例如
find_in_set( 1 ,‘1,2,3,4’) 成立
find_in_set( 5 ,‘1,2,3,4’) 不成立
这个函数让很多地方写sql灵活了许多
比如,以前写 delete from table where id in (1,2,3,4,5)
就可以写成 delete from table where find_in_set(id,‘1,2,3,4,5’)
这对写sql也许变化不大,但是写程序就方便了很多,可以直接传字符串做参数来实现删除多个的功能
Share 分享一篇有观点和思考的技术文章
前段时间看到pdd上有人猝死,给我很大的震撼。
一个人连续50天996就会死
这样看的话,我差不多是多次游走在死亡边缘了
今年 我差不多一年都在加班,虽然说没到连续加一年这种恐怖。
有时候生命可以很脆弱,加油,打工人