有多个字符串从标准输入传递给此程序。第一个int输入T,是传递给该程序的测试用例(字符串)的数量。具有不同替代字符的字符串是完美的。如果备用字符相同,则需要删除这两个字符中的1个。基本上,您需要计算,需要删除多少个字符才能获得完美的字符串?例如:ABABAB是完美的,而AABABAA并不完美。你需要删除2个A,第一个和最后一个。在AAAA中,你需要删除3个A来获得一个完美的字符串。字符串输入可能非常大。计算此类删除次数的最快方法是什么?我写的下面的代码工作得很慢。
public static void main(String[] args) {
Scanner scan = new Scanner (System.in);
int T= scan.nextInt();
String str;
int count=0;
for(int i=0; i<T; i++){
str=scan.next();
for(int j=0; j<str.length()-1; j++){
if(str.charAt(j)!=str.charAt(j+1)){
j+=2;
}
else{
count++;
}
}
System.out.println(count);
}
}
答案 0 :(得分:1)
在您担心性能之前,请先担心您的解决方案是否正确。对于输入ABAAB,您的程序返回0,但必须删除1 A才能获得完美的字符串。
然后:你是什么意思&#34;非常大&#34;。这是多少个字符?什么是#34;非常慢&#34;?
你必须至少查看一次字符串的每个字符,这样你就不会快得多。但是,您可以优化一下。目前,您可能会查看单个字符两次(一次在str.charAt(j+1)
中,并在str.charAt(j)
的下一次迭代中)。当然可以编写算法,使字符串的每个字符都只访问一次。但同样,在关注速度之前,你应该专注于正确性。
答案 1 :(得分:0)
在消除所有逻辑错误后,这是我的工作代码。对于某些测试用例,其执行时间最长为0.45-0.50秒。它的性能能提高吗?
public static void main(String[] args) {
int T=0; String str;
Scanner sc = new Scanner(System.in);
T=sc.nextInt();
for(int i=0; i<T; i++){
str= sc.next();
solve(str);
}
}
public static void solve(String str){
char first, second; int count=0;
for(int i=0; i<str.length()-1; i++){
first= str.charAt(i);
second= str.charAt(i+1);
if(first==second){
count++;
}
}
System.out.println(count);
}