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