又到打卡的一天!!!
感觉时间过的真快,这一天天的一下子就过去了!!!
PS:明天就出高考成绩了,祝我弟考了个好成绩!!!!
废话不多说,开始总结今天写的题…
题目
(1)题目描述:
这个题目,很熟悉,回文串…但是很少写,还是得尝试尝试加油!!!
(2)解法
- 开始做法
回文串的一个很重要的点就是找到中间这个点,回文串应该分为两种情况:
1. …AbA’…
2. …Bbbb…B’…
根据这两个情况,主要也是找到b或者n个b这样的情况,所以代码应该分为两个部分,从开头开始,依次寻找,废话不多说,先上代码:
string longestPalindrome(string s) {
int max_num = 0;
int max_begin = 0;
int begin =0;
int end = 0;
for(int i=0;i<s.length();i++){
end = begin = i;
//不存在中间值或中间值与对称部分相同时
while((end<s.size()-1) &&s.at(end+1)==s.at(begin)){
end ++;
}
//对称部分
while((begin>0)&&(end<(s.size()-1))&&(s.at(begin-1)==s.at(end+1))){
begin --;
end ++;
}
if((end-begin+1)>max_num){
max_begin = begin;
max_num = end-begin+1;
}
}
return s.substr(max_begin,max_num);
}
代码了采用双指针begin和end,指向关于中间值对称的两边,通过寻找两种情况的回文串,存储每一次的最大长,然后判断找出最大长和相应的位置,当然这很明显可以优化!!!下面代码再见!!!
运行结果:
时间复杂度大概还是平方级别的,所以时耗还是不小啊。
- 优化后
1、在n个b的情况时,如果在下一次循环时,依旧从这n个b中开始,显然结果是会比前一次结果更小的,所以很显然,这n个b中,可以直接跳过,可以减少不少时间!!!
2、当寻找中间值时,有可能剩下的循环,已经不足或者等于现已有最大长度的回文串的一半,很显然,也同样的不须再运行下去!!!
…还有待寻找,今天有点晚…(以后有时间,我要一个个回来把没有完善的都好好改一遍!!!)
废话不多说先上代码:
string longestPalindrome(string s) {
int max_num = 0;
int max_begin = 0;
int begin =0;
int end = 0;
for(int i=0;i<s.length();i++){
if((s.length()-i-1)<=max_num/2&&max_num!=0){
break;
}
end = begin = i;
//不存在中间值或中间值与对称部分相同时
while((end<s.size()-1) &&s.at(end+1)==s.at(begin)){
end ++;
}
//跳过n个b的部分
i = end;
//对称部分
while((begin>0)&&(end<(s.size()-1))&&(s.at(begin-1)==s.at(end+1))){
begin --;
end ++;
}
if((end-begin+1)>max_num){
max_begin = begin;
max_num = end-begin+1;
}
}
return s.substr(max_begin,max_num);
}
结果:
后来我发现有可能,第2种优化有可能,不仅没有减少耗时,还有可能增加了!!!
这是 减去代码后的结果,当然不排除是每一次运行不一样的原因!!!:
这个题做完了,那么BaB这样的串怎么找呢,我想应该也可以通过双指针的方式把他做出来,时间复杂度应该是差不多的!!!
今天就先到这啦!!!
明天就出高考成绩了!!激动的心颤抖的手啊~
睡觉!~!!!!!