题目的主要信息:
- 对于输入的一个字符串,返回其最长的数字子串,以及其长度
- 如果最长有多个,都要输出
方法一:遍历截取拼接
具体做法:
可以遍历输入的字符串,检查每个字符,如果遇到数字我们开始循环计算这一段连续的数字子串的长度(直接循环直到非数字,然后首尾相减即可),比较这一段子串的长度与最大长度之间的大小关系,如果这一段更长,则要输出的字符串直接等于这一段子串,用substring方法截取,同时更新最大长度;如果这一段等于最大长度,则将其截取后拼接在要输出的字符串后面。
import java.util.*;
import java.math.*;
public class Main{
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
while(sc.hasNextLine()){
String str = sc.nextLine();
int max = 0;
String s = null;
for(int i = 0; i < str.length(); i++){
if(str.charAt(i) >= '0' && str.charAt(i) <= '9'){ //找到数字字符
int start = i; //从这个字符起,遍历所有连续的数字字符
while(i < str.length() && str.charAt(i) >= '0' && str.charAt(i) <= '9')
i++;
int len = i - start; //计算这一段长度
if(len > max){ //长度更大,更新最大值,输出字符串等于新的子串
max = len;
s = str.substring(start, i);
}else if(len == max){ //长度相等,输出字符串添加新的子串
s = s + str.substring(start, i);
}
}
}
System.out.println(s + "," + max);
}
}
}
复杂度分析:
- 时间复杂度:,其中为字符串长度,遍历需要遍历整个字符串
- 空间复杂度:,辅助子串的长度最坏情况下为
方法二:正则表达式
具体做法:
可以使用正则表达式将数字子串分割出来,然后遍历分割出来的子串们,统计出最长长度,最后再次遍历分割出来的字串们,连续输出长度为最长长度的子串。
import java.util.*;
import java.math.*;
public class Main{
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
while(sc.hasNextLine()){
String str = sc.nextLine();
String s[] = str.split("[^0-9]"); //根据正则表达式分割出数字字符串
int max = 0;
for(int i = 0; i < s.length; i++){ //遍历分割的字符串,找到最大长度
if(s[i] != "")
max = Math.max(max, s[i].length());
}
for(int i = 0; i < s.length; i++){ //再次遍历输出最大长度
if(s[i] != "" && s[i].length() == max)
System.out.print(s[i]);
}
System.out.println("," + max);
}
}
}
复杂度分析:
- 时间复杂度:,其中为字符串长度,多次遍历
- 空间复杂度:,其中存储分割出来的字符串的空间最坏为