具体算法为:从头到尾遍历字符串,每当遇到数字连续数字子串时,记录其长度。并与全局记录的最长长度相比较。如果更长的话,就记录当前长度和开始index。
 

public class LongestNumberSubstring {
    public static int[] findLongestNumSubstring(String input) {
        // If the string is empty, return [0, 0] directly.
        if (input == null || input.length() == 0) {
            return new int[]{0, 0};
        }

        int index = 0;
        int[] ret = new int[]{0, 0}; //[start_index, length]
        int currLen = 0;
        while (index < input.length()) {
            currLen = 0;
            while (index < input.length() && Character.isDigit(input.charAt(index))) {
                currLen++;
                index++;
            }

            // If current substring is longer than or equal to the previously found substring
            // Put it in return values.
            if (currLen != 0 && ret[1] <= currLen) {
                ret[1] = currLen;
                ret[0] = index - currLen;
            }
            index++;
        }

        return ret;
    }
}

 

                                    最长数字字符串

题目一 最长数字字符串

给定一个字符串,输出字符串中最长的数字串,并把这个数字串的长度输出。

请一个在字符串中找出连续最长的数字串,并把这个串的长度返回;如果存在长度相同的连续数字串,返回最后一个连续数字串;

注意:数字串只需要是数字组成的就可以,并不要求顺序,比如数字串“1234”的长度就小于数字串“1359055”,如果没有数字,则返回空字符串(“”)而不是NULL!

输入描述:
一个字符串
输出描述:
输出最长的数字串,输出最长数字串个数;
中间以逗号(,)隔开;

示例1
输入
abcd12345ed125ss123058789
输出
123058789,9

备注:
1、如果存在长度相同的连续数字串,则输出最后一个连续数字串;
2、数字串只需要是数字组成的就可以,并不要求顺序,比如数字串“1234”的长度就小于数字串“1359055”;
3、如果没有数字,则输出空字符串(“”)而不是NULL;
解题思路:

首先将数字串拿出来,然后在遍历数字串长度找出最长的值
 

public class Test1 {
    public static void main(String[] args) {
        String str1="";
        String str= "abcd12345ed125ss123058789";
        for(char ch:str.toCharArray()){
            //将不是数字的字符全部变成a
            if(ch>='0' && ch<='9'){
                str1+=ch;
            }else{
                str1+="a";
            }
        }
        //按a分割
        String[] strs=str1.split("a");
        int max=0;//记录最长的连续数字串的长度
        for(int i=0;i<strs.length;i++){
            max=strs[i].length()>max?strs[i].length():max;
        }
        for(int i=0;i<strs.length;i++){
            if(strs[i].length()==max)
                System.out.print(strs[i]);
        }
        System.out.println(","+max);
    }
}

 

给出一个字符串作为输入,找出其中最长的连续数字串并返回其长度和起始index。如果存在长度相同的连续数字串,返回最后一个连续数字串。如果没有,返回0和0。

 

但事实上,考虑到我们需要的只是子字符串的起始index和长度,这道题可以用2 pointers的方法解决。并不需要记录中间产生的任何子字符串。这样的话我们可以将算法的空间复杂度降到O(1)。