题目描述
请在一个字符串中找出连续最长的数字串,并返回这个数字串。如果存在长度相同的连续数字串,则返回最后一个。如果没有符合条件的字符串,返回空字符串""
注意
数字串可以由数字"0-9"、小数点"."、正负号"+-"组成,长度包括组成数字串的所有符号。"."、"+-"仅能出现一次,"."的两边必须是数字,"+-"仅能出现在开头且其后必须要有数字。输入字符串长度不定,可能含有空格。
输入描述
一行字符串
输出描述
符合题意的连续数字串或空串
输入输出示例
序号 | 样例输入 | 样例输出 | 说明 |
---|---|---|---|
1 | 1234567890abcd9.+12345.678.9ed | +12345.678 | 无 |
题目解析
此题可用正则表达式,但是通过率只有85%。此题也可以用双指针做法,但是通过率依然只有85%。大家可以尝试下其他方法,贡献下测试用例。下面的代码均是基于正则表达式做法。
C++源码
#include<iostream>
#include<string>
#include<algorithm>
#include<regex>
using namespace std;
string check(const string &ss) {
regex reg("[+-]?[0-9]+(\\.[0-9]+)?");
string::const_iterator iter=ss.begin();
string ans;
smatch res;
while(regex_search(iter, ss.end(),res,reg)) {
string tmp = res[0];
int n = tmp.size();
if(n>=ans.size()) {
tmp.swap(ans);
}
iter = res[0].first;
while(++iter!=res[0].second && (*iter)!='.')
;
}
return ans;
}
int main() {
string ss;
while(getline(cin, ss)) {
cout << check(ss) << endl;
}
return 0;
}
python源码
import re
strs = input().strip()
t = "[+-]?\d+(\.\d+)?"
def fun():
ans = ""
n = len(strs)
for i in range(n):
tmpL = re.search(t,strs[i:])
if tmpL:
for j in range(len(tmpL.groups()) ):
T = tmpL.group(j)
m = len(T)
if m >= len(ans):
ans = T
return ans
res = fun()
print(res)
Java源码
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.nextLine().trim();
String pattern = "[+-]?\\d+(\\.\\d+)?";
String res = "";
for (int i = 0; i < s.length(); i++) {
String temp = s.substring(i);
Matcher matcher = Pattern.compile(pattern).matcher(temp);
if (matcher.find()) {
if (matcher.group(0).length() >= res.length()) {
res = matcher.group(0);
}
}
}
System.out.println(res);
}
}