晚上,
我正在努力寻找解决此问题的最佳解决方案:
输入:
String1 = "algrtvy";
String2 = "alg";
String3 = "gvy";
String4 = "mgr";
String5 = "aall";
str2,3,4,5的字符是否包含在1?
中输出
true
true
false
false
所以,我不是要检查序列(子串),而是检查单个字符。
任何提示? 我正在寻找计算时间内禁食的解决方案。
解决方案:
此解决方案是来自@ davidxxx的答案的实施版本。
public boolean haveChars(String longerString, String shorterString) {
String chars = longerString;
for (char c : shorterString.toCharArray()){
int index = chars.indexOf(c);
if (index == -1) {
return false;
} else {
chars = chars.substring(0,index) + chars.substring(index + 1);
}
}
return true;
}
答案 0 :(得分:1)
如果你的字符串很短,你可以使用
.map(joke => <Joke>{id: joke.id, value: joke.value});
如果M是字符串的大小,N是sub的大小,那么在最坏的情况下它是O(N * M)。
如果它很大,或者你想多次对同一个字符串进行检查,你可以先将它设为Set,并使用相同的原则:
String string = "abcdefgh";
String sub = "adf";
boolean ok = sub.chars().allMatch(c -> string.indexOf((char) c) >= 0);
这是O(M)+ O(N)。
另一种可能性是改为创建子字符串:
Set<Character> set = string.chars().mapToObj(c -> ((char) c)).collect(Collectors.toSet());
ok = sub.chars().allMatch(c -> set.contains((char) c));
再次O(M)+ O(N)。
您现在应该衡量您的预期投入。但要注意:Java中的基准测试很难。
答案 1 :(得分:1)
1)以int
值存储要在输入中查找的字符数。
它是一个计数器,可以让你知道比赛是否成功。
并制作当前模型的副本以匹配
它不是强制性的,因为String
是不可变的,但它使事情变得更加清晰。
2)迭代您尝试与模型副本匹配的输入中包含的每个字符。
3)一旦字符匹配,递减计数器并将其从模型副本中删除。
4)只要计数器的值为0
,就意味着输入和模型匹配。
5)如果在输入字符的循环之后,计数器的值不是0
,则表示输入与模型不匹配。
你可以有这样的方法:
public static boolean isMatch(String model, String input) {
int nbCharacterRemaningToFind = input.length();
String copyModel = model;
for (char c : input.toCharArray()) {
String cInString = String.valueOf(c);
if (copyModel.contains(cInString)) {
copyModel = copyModel.replaceFirst(cInString, "");
nbCharacterRemaningToFind--;
if (nbCharacterRemaningToFind == 0) {
return true;
}
}
}
return false;
}
答案 2 :(得分:0)
你可以简单地检查创建一个新函数(containsEachChar)来检查包含这样的内容:`
public boolean containsEachChar(String string1, String string2) {
for (char c : string2.toCharArray()) {
if(string1.indexOf( c) == -1){
return false;
}
}
return true;
}
`
语句string1.indexOf(c)返回'string1'中'c'的位置。如果'string1'中不存在'c',则返回-1。
现在,您可以从主方法调用上面的方法:`
public static void main(String[] args) {
String string1 = "algrtvy";
String string2 = "alg";
String string3 = "gvy";
String string4 = "mgr";
System.out.println(containsEachChar(string1, string2));
System.out.println(containsEachChar(string1, string3));
System.out.println(containsEachChar(string1, string4));
}
输出: 真正 真正 假
containsEachChar中的代码是什么,
答案 3 :(得分:0)
请注意,这可能是一个效率低下的解决方案,但我在这里要做的是使用containsALL来检查集合的内容是否包含在另一个集合中
String string1 =“algrtvy”;
//turn it to arraylist
List<String> string1ArrayList = Arrays.asList(string1.split(""));
String string2 = "alg";
String string3 = "gvy";
String string4 = "mgr";
String string5 = "aall";
//check its in the arraylist
System.out.println(string1ArrayList.containsAll(Arrays.asList(string2.split(""))));
System.out.println(string1ArrayList.containsAll(Arrays.asList(string3.split(""))));
System.out.println(string1ArrayList.containsAll(Arrays.asList(string4.split(""))));
System.out.println(string1ArrayList.containsAll(Arrays.asList(string5.split(""))));
*
结果:true true false true
*