题目:
给定一串字符,里面有些字符有连续出现的特点,请寻找这些连续字符串中最长的串,如果最长的串有多个,请输出ascii最小的个
思路:
利用start和end来记录当前连续出现的子字符串的起始位置,如果当前字符串长度>历史最大长度或者两长度相同但当前串字符的ascii小,则用当前字符串的起始位置覆盖掉历史最长的那个。
这里有个边界问题要考虑,当前子串的结尾移动到最后一个字符时,
我的代码只通过75%,不知道哪些没通过。
import java.util.Scanner;
public class Solution {
public static String maxRepat(String str) {
if (str == null || str.length() == 0)
return "";
int start=0,end=1,maxStart=0,maxEnd=1;
char[] chars = str.toCharArray();
for (int i = 1; i < chars.length; i++) {
if(chars[i-1]!=chars[i] ||(i==chars.length-1&&chars[i-1]==chars[i]))
{
end=i;
if(i==chars.length-1&&chars[i-1]==chars[i])
end++;
int len = end - start;
if (len > (maxEnd - maxStart)||((len ==(maxEnd - maxStart))&&((int)chars[start]<(int)chars[maxStart]))) {
maxStart = start;
maxEnd = end;
}
start = end;
}
}
return str.substring(maxStart,maxEnd);
}
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
String st=input.nextLine();
System.out.println(maxRepat(st));
}
}
上述代码没有通过的例子有:
输入
dsa
输出
d
但实际是a
原因:边界判断出错,除了aa这种情况要重新算,单独的a应该也要停下来。单独a,end算出来,和Start一样,导致Len=0.不会考虑在新子串内。
修改后的代码:
package jianzhioffer;
import java.util.Scanner;
public class Solution {
public static String maxRepat(String str) {
if (str == null || str.length() == 0)
return "";
int start=0,end=1,maxStart=0,maxEnd=1,len=0;
char[] chars = str.toCharArray();
for (int i = 1; i <=chars.length; i++) {
if(((i!=chars.length)&&(chars[i-1]!=chars[i]))||i==chars.length)
{
end=i;
len = end - start;
if (len > (maxEnd - maxStart)||((len ==(maxEnd - maxStart))&&((int)chars[start]<(int)chars[maxStart]))) {
maxStart = start;
maxEnd = end;
}
start = end;
}
}
return str.substring(maxStart,maxEnd);
}
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
String st=input.nextLine();
System.out.println(maxRepat(st));
}
}