题目的主要信息:

  • 对于输入的一个字符串,返回其最长的数字子串,以及其长度
  • 如果最长有多个,都要输出

方法一:遍历截取拼接

具体做法:

可以遍历输入的字符串,检查每个字符,如果遇到数字我们开始循环计算这一段连续的数字子串的长度(直接循环直到非数字,然后首尾相减即可),比较这一段子串的长度与最大长度之间的大小关系,如果这一段更长,则要输出的字符串直接等于这一段子串,用substring方法截取,同时更新最大长度;如果这一段等于最大长度,则将其截取后拼接在要输出的字符串后面。

alt

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);
        }
    }
}

复杂度分析:

  • 时间复杂度:O(n)O(n),其中nn为字符串长度,遍历需要遍历整个字符串
  • 空间复杂度:O(n)O(n),辅助子串的长度最坏情况下为O(n)O(n)

方法二:正则表达式

具体做法:

可以使用正则表达式将数字子串分割出来,然后遍历分割出来的子串们,统计出最长长度,最后再次遍历分割出来的字串们,连续输出长度为最长长度的子串。

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);
        }
    }
}

复杂度分析:

  • 时间复杂度:O(n)O(n),其中nn为字符串长度,多次遍历
  • 空间复杂度:O(n)O(n),其中存储分割出来的字符串的空间最坏为nn