华为2018校园招聘(提前批) 笔试 输出ascii最小的最长连续字符串

题目:
给定一串字符,里面有些字符有连续出现的特点,请寻找这些连续字符串中最长的串,如果最长的串有多个,请输出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应该也要停下来。单独aend算出来,和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));
}
}

猜你喜欢

转载自blog.csdn.net/gsch_12/article/details/81349276