Java代码解析:构造回文字符串问题
问题描述:
小C手中有一个由小写字母组成的字符串 s。她希望构造另一个字符串 t,并且这个字符串需要满足以下几个条件:
t由小写字母组成,且长度与s相同。t是回文字符串,即从左到右与从右到左读取相同。t的字典序要小于s,并且在所有符合条件的字符串中字典序尽可能大。
小C想知道是否能构造出这样的字符串 t,输出这样的t。如果无法构造满足条件的字符串,则输出 -1。
代码实现解析
首先是需要将输入的字符取一半下来并将其反转拼接回去
int n = s.length();
int halflen = (n+1)/2; //获取字符串长度一半
String prefix = s.substring(0,halflen);
//reser()是反转字符串
String t = prefix + new StringBuiler(prefix.substring(0,n/2)).reserve().toString();
这样得到的回文字符串需要做判断是否小于s
if(t.compareTo(s)<0){
return t;
}
如果不小于,则开始往下减,这里有个问题就是,并不是从整个回文字符串最后一个开始减,因为这样减会造成头部也减,所以反而是从中间开始
所以是获取了回文字符串的一半,并从末尾开始判断,这里我一开始走入了误区以为是需要一位一位往前减,如果减了没达成条件就继续往前减,但实际上只要减一次就能达成目标,这里代码的目的是为了如果当前字符是'a'就往前移一位,因为a是没法再减的。
for(int i = halflen-1; i >= 0; i--){
if(prefix.charAt(i) > 'a'){
StringBuilder newPrefix = new StringBuilder(prefix.substring(0,i));
newPrefix.append((char)(prefix.charAt(i)-1));
for(j=i+1;j<halflen;j++){
newPrefix.append('z');
}
t = newPrefix.toString()+new StringBuilder(newPrefix.substring(0,i)).reserve().toString();
return t;
}
}
以上便是这道题的关键代码解读
AI刷题感受:
豆包大部分时候给出的答案都是能够运行,但这并不是我们使用它的目的,我们使用AI的目的是能够减少我们搜索资料的时间,所以使用的时候我们主要方法应该是自己先思考思路,尝试写一下,写不出来可以向豆包分享我们的思路看是否有误。如果毫无思路可以参考豆包的思路并自己写出来. 这道题我是结合豆包一起写的,但AI不是万能的,它也给了我部分错误的思路,以及它的代码里是有可以优化的地方,所以结合AI解题的时候不要就看看觉得自己理解了,需要自己从头到位理一遍且明白考验的什么算法,最后再能够自己完整的手敲一遍出来,同时也可以在之后做几道同类型的题目来验证自己是否明白以及巩固学到的知识。