Java:如何检查字符串

时间:2017-05-26 08:57:10

标签: java string character

晚上,

我正在努力寻找解决此问题的最佳解决方案:

输入:

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;
}

4 个答案:

答案 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中的代码是什么,

  1. 它迭代string2中的字符。
  2. 如果值string1.indexOf(c)为-1,则检查string2中的其他字符不是必需的,该函数只返回false。

答案 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

*