我一直在使用正則表達式解決USACO處的「Broken Necklace」問題。雖然它對於較小的輸入工作正常,儘管它是一個非常複雜的正則表達式,但它對於較大的輸入超出了給定的時間限制。如何在使用正則表達式時減少運行時間?
有關更多信息,請參閱我使用的代碼。我的問題是如何在仍然使用正則表達式的同時改進運行時。
非常感謝所有幫助。我是一個競爭性編程的新手,我真的陷入了困境:s!
class beads {
public static void main(String[] args) throws IOException{
BufferedReader f = new BufferedReader(new FileReader("beads.in"));
//BufferedReader f = new BufferedReader(new FileReader("beads.txt"));
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("beads.out")));
int numBeads=Integer.parseInt(f.readLine());
String input=f.readLine();
String beadSequence=input.concat(input);
Pattern p1=Pattern.compile("^(w*r*)|^(w*b*)*");
Matcher m1=p1.matcher(input);
while(m1.find()){
String k=m1.group();
//System.out.println(k);
if(k.length()==numBeads){
out.println(k.length());
out.close();
System.exit(0);
}
}
//System.out.println(input);
//System.out.println(beadSequence);
Pattern p=Pattern.compile("(?=((b*w*)*b+w*r+(w*r*)*|(r*w*)*r+w*b+(w*b*)*))(^|(?<=w)b|(?<=b)w|(?<=w)r|(?<=r)w)");
Matcher m=p.matcher(beadSequence);
List<String> solutions=new ArrayList<String>();
int length=0;
while(m.find()){
String k=m.group(1);
//System.out.println(m.group(1));
if (k.length()>length)length=k.length();
}
out.println(length);
out.close();
System.exit(0);
}
}
看起來你需要在這裏使用基本的'字符串'操作。 –