问题陈述:当我在代码中使用String.matches("(\\w)\\1")
时。
在对长度超过100的字符串执行某些尝试后,它会给出不一致的结果
复制此问题的步骤:
创建java类:
import java.util.Scanner;
public class ReducedString {
static String super_reduced_string(String s){
boolean isStringFinished = false;
String newString = "";
while(!isStringFinished) {
newString = s.replaceAll("(\\w)\\1","");
s = newString;
if(!s.matches("(\\w)\\1")){
isStringFinished = true;
}
}
if(newString.length() == 0 )
newString = "Empty String";
return newString;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s = in.next();
String result = super_reduced_string(s);
System.out.println(result);
}
}
请运行它并提供以下字符串作为输入:
oagciicgaoyjmahhamjymmwjnnjwmmvpxhpphxpvlikappakilyygvkkvgyymlpfddfplmhiodvvdoihfxpkggkpxfuevvuuvveu
基本上代码逻辑试图删除所有相邻的相似内容 字符和减少输入字符串所以预期应该是: “空字符串”。但是不会得到这个结果。
为了获得预期的输出,我尝试使用方法matchPattern()
:
import java.util.Scanner;
public class ReducedString {
static String super_reduced_string(String s){
boolean isStringFinished = false;
String newString = "Empty String";
while(!isStringFinished) {
newString = s.replaceAll("(\\w)\\1","");
s = newString;
if(!matchPattern(s)){
isStringFinished = true;
}
}
if(newString.length() == 0 )
newString = "Empty String";
return newString;
}
static boolean matchPattern(String s) {
boolean isStringFinished = false;
for(int i = 0 ; i < s.length()-1;i++) {
char c1 = s.charAt(i);
char c2 = s.charAt(i+1);
if(c1==c2)
return true;
}
return isStringFinished;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s = in.next();
String result = super_reduced_string(s);
System.out.println(result);
}
}
如果有人遇到同样的问题,请你告诉我为什么内置功能会产生这种不一致的结果
答案 0 :(得分:1)
正如Usagi Miyamoto在评论中所说,问题是使用String.matches()
只匹配整个字符串。
此外,由于您经常使用该模式,因此在使用之前对其进行编译将加快该过程,从而加快速度。我让它像这样工作:
import java.util.*;
import java.util.regex.*;
import java.lang.*;
import java.io.*;
import java.util.Scanner;
class ReducedString {
static String super_reduced_string(String s){
Pattern p = Pattern.compile("(\\w)\\1"); // precompile pattern
while(s.length() > 0 && !p.matcher(s).matches()){
// check on the length to avoid matching the empty string
s = p.matcher(s).replaceAll("");
}
if(s.length() == 0 ){
s = "Empty String";
}
return s;
}
public static void main(String[] args) {
String result = super_reduced_string("oagciicgaoyjmahhamjymmwjnnjwmmvpxhpphxpvlikappakilyygvkkvgyymlpfddfplmhiodvvdoihfxpkggkpxfuevvuuvveu");
System.out.println(result);
}
}
答案 1 :(得分:0)
致电str.matches(regex)
相当于Pattern.matches(regex, str)
,相当于Pattern.compile(regex).matcher(str).matches()
。
Matcher.matches()
方法尝试将整个输入序列与模式匹配。
请参阅: