我被要求这样做:
写入函数scramble(str1,str2),如果str1字符的一部分可以重新排列以匹配str2,则返回true,否则返回false。
例如: str1是'rkqodlw'而str2是'world',输出应该返回true。 str1是'cedewaraaossoqqyt'而str2是'codewars'应该返回true。 str1是'katas'而str2是'steak'应该返回false。
仅使用小写字母(a-z)。不会包含标点符号或数字。 需要考虑性能
我的代码是:
import java.util.ArrayList;
公共类Scramblies {
static ArrayList<String> strTwo = new ArrayList<String>();
static ArrayList<String> strOne = new ArrayList<String>();
static String sub1;
static String sub2;
public static void main (String[] args){
}
public static boolean scramble(String str1, String str2) {
boolean can = false;
int str1length = str1.length();
int looping = 0;
int counter = 0;
//put str1 into arraylist strOne
for (int i = 0; i < str1.length(); i++){
sub1 = str1.substring(i);
for (int k = 0; k<str1.length(); k++){
strOne.add(k, sub1);
}
}
//Put str2 into arraylist strTwo
for (int i = 0; i< str2.length(); i++){
sub2 = str2.substring(i);
for (int k = 0; k < str2.length(); k++){
strTwo.add(k,sub2);
}
}
//now search for str1 in the array strTwo. While loop so that it keeps looping the first for statement
while (looping != str1.length()){
for (int x = 0; x < strOne.size(); x++) {
looping++;
if(strTwo.contains(strOne.get(x))) {
counter++;
}
}
}
if (counter == str2.length()){ //check the counter against the length of str1 (int str1length) and if they are the same then can = true
can = true;
} else {
can = false;
}
return can;
}
}
我的问题是:这段代码是否有效 - 如果是的话 - 如何才能提高效率。我认为这个概念有效,但缺乏优雅导致我在编码和执行代码大战中的代码时失去了时间限制。
更新:
根据我已更新代码的一些评论,这非常有效。然而,效率问题仍然存在。这是代码:
公共类Scramblies {
public static boolean scramble(String str1, String str2) {
String temp = str1;
int count = 0;
boolean result = true;
for(int i=0 ; i<str2.length() ; i++){
char c = str2.charAt(i);
if(temp.contains(String.valueOf(c))){
temp = temp.replaceFirst(String.valueOf(c), "");
count++;
}
}
if (count == str2.length()){
result = true;
} else {
result = false;
}
return result;
}
}
如果有人可以帮助我提高这段代码的效率,那么在与测试的效率部分运行时它不会超时,那就太好了。我也在这里发布:https://codereview.stackexchange.com/questions/124172/comparing-two-strings-to-see-if-string-2-is-inside-string-1
答案 0 :(得分:2)
创建一个整数数组,大小足以容纳所有可能的字符(英语为26),并初始化为0.
对于大字符串中的每个字符,获取当前整数并增加1.这表示可以重新排列的所有可能字符。
对于小字符串中的每个字符,获取当前整数值并递减1.如果在任何时候,更新的值为-1,则不能重新排列较大的字符串。
顺便说一句,出于性能原因,您可能会考虑使用原始字符缓冲区而不是子字符串或拉出单个字符。
答案 1 :(得分:1)
您可以编写一个方法,遍历String
s2的每个字符并检查它是否存在于s1
中,同时删除匹配事件形式s1,例如:
private static boolean canScramble(String s1, String s2){
String temp = s1;
boolean result = true;
for(int i=0 ; i<s2.length() ; i++){
char c = s2.charAt(i);
if(temp.contains(String.valueOf(c))){
temp = temp.replaceFirst(String.valueOf(c), "");
}else{
result = false;
break;
}
}
return result;
}