Java 为什么下面可以确定str1和str2是否为字谜?

Java 为什么下面可以确定str1和str2是否为字谜?,java,Java,我正在阅读一段代码片段,我想知道为什么下面的代码会 检查str1和str2是否为字谜 boolean result = str1.chars().allMatch( c1 -> str2.chars() .anyMatch( c2 -> c1 == c2) ); 我对这个问题特别困惑 如果str1=“abc”str2=“cbad”,结果也应该是真的,对吗 我特别困惑的是,如果str1=“abc”str2=“cbad”,结果也应该是正确的,对吗

我正在阅读一段代码片段,我想知道为什么下面的代码会 检查str1和str2是否为字谜

boolean result =  str1.chars().allMatch( c1 -> str2.chars()
                   .anyMatch( c2 -> c1 == c2) );
我对这个问题特别困惑 如果str1=“abc”str2=“cbad”,结果也应该是真的,对吗

我特别困惑的是,如果str1=“abc”str2=“cbad”,结果也应该是正确的,对吗

代码将返回
true
,是。因此,不,这不是一个有效的字谜检查,因为在您引用的示例中,它会说它是一个字谜,而不是(因为
str1
没有
d

在一个字谜中,两个字符串需要出现相同数量的相同字母。这样做的一个副产品是,它们需要相同的长度(尽管在一些字谜模式中,您可以改变空格的数量并添加/删除标点符号)

因此,有效的检查需要确保
str1
中的每个字符(可能忽略空格和标点)都使用了
str2
中的一个字符,并且在末尾没有
str2
中的字符(可能忽略空格和标点)。有很多方法可以做到这一点(在
str1
中,可能在
Map
中计算出现次数,然后从
str2
中倒计时匹配项;从字符串中删除字母等)。引用的代码不是其中之一

我特别困惑的是,如果str1=“abc”str2=“cbad”,结果也应该是正确的,对吗

代码将返回
true
,是。因此,不,这不是一个有效的字谜检查,因为在您引用的示例中,它会说它是一个字谜,而不是(因为
str1
没有
d

在一个字谜中,两个字符串需要出现相同数量的相同字母。这样做的一个副产品是,它们需要相同的长度(尽管在一些字谜模式中,您可以改变空格的数量并添加/删除标点符号)

因此,有效的检查需要确保
str1
中的每个字符(可能忽略空格和标点)都使用了
str2
中的一个字符,并且在末尾没有
str2
中的字符(可能忽略空格和标点)。有很多方法可以做到这一点(在
str1
中,可能在
Map
中计算出现次数,然后从
str2
中倒计时匹配项;从字符串中删除字母等)。引用的代码不是其中之一。

如果有str1=“abc”和str2=“cbad”,它们不能是彼此的字谜,因为str2包含str1没有的额外字符d。如果一个单词是另一个单词的字谜,那么它们需要具有相同的字符和相同的频率

话虽如此,我只是运行了您编写的代码,它不适用于您提到的特定情况

确定一个字符串是否是另一个字符串的字谜的一种方法是使用两个HashMap。对于每个字符串,循环遍历它,跟踪每个字符作为键,跟踪其频率作为值。最后,您可以循环遍历这两个HashMap并继续比较每个键的值。如果值不相等,则返回false

还要检查的第一件事是两个字符串的长度应该相等。如果他们没有达到这个条件,那么他们就不可能是一个字谜

以下是我几个月前在LeetCode上编写的代码。这当然可以优化,使更清洁,但只是给你一个想法

public class Solution {
    public boolean isAnagram(String s, String t) {
        if (s.length() != t.length()) {
            return false;
        }
        HashMap<Character, Integer> map = new HashMap<Character, Integer>();
        HashMap<Character, Integer> tmap = new HashMap<Character, Integer>();
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (map.containsKey(c)) {
                int count = map.get(c);
                map.put(c, count + 1);
            }
            else {
                map.put(c, 1);
            }
        }
        for (int j = 0; j < t.length(); j++) {
            char d = t.charAt(j);
            if (!(map.containsKey(d))) {
                return false;
            }
            if (tmap.containsKey(d)) {
                int tracker = tmap.get(d);
                tmap.put(d, tracker + 1);
            }
            else {
                tmap.put(d, 1);
            }
        }
        for (Character key: map.keySet()) {
            int mapv = map.get(key);
            int tmapv = tmap.get(key);
            if (mapv != tmapv) {
                System.out.println(tmapv);
                System.out.println(mapv);
                return false;
            }
        } 
        return true;
    }
}
公共类解决方案{
公共布尔isAnagram(字符串s、字符串t){
如果(s.length()!=t.length()){
返回false;
}
HashMap=newHashMap();
HashMap tmap=新的HashMap();
对于(int i=0;i
如果您有str1=“abc”和str2=“cbad”,它们不能是彼此的字谜,因为str2包含str1没有的额外字符d。如果一个单词是另一个单词的字谜,那么它们需要具有相同的字符和相同的频率

话虽如此,我只是运行了您编写的代码,它不适用于您提到的特定情况

确定一个字符串是否是另一个字符串的字谜的一种方法是使用两个HashMap。对于每个字符串,循环遍历它,跟踪每个字符作为键,跟踪其频率作为值。最后,您可以循环遍历这两个HashMap并继续比较每个键的值。如果值不相等,则返回false

还要检查的第一件事是两个字符串的长度应该相等。如果他们没有达到这个条件,那么他们就不可能是一个字谜

以下是我几个月前在LeetCode上编写的代码。这当然可以优化,使更清洁,但只是给你一个想法

public class Solution {
    public boolean isAnagram(String s, String t) {
        if (s.length() != t.length()) {
            return false;
        }
        HashMap<Character, Integer> map = new HashMap<Character, Integer>();
        HashMap<Character, Integer> tmap = new HashMap<Character, Integer>();
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (map.containsKey(c)) {
                int count = map.get(c);
                map.put(c, count + 1);
            }
            else {
                map.put(c, 1);
            }
        }
        for (int j = 0; j < t.length(); j++) {
            char d = t.charAt(j);
            if (!(map.containsKey(d))) {
                return false;
            }
            if (tmap.containsKey(d)) {
                int tracker = tmap.get(d);
                tmap.put(d, tracker + 1);
            }
            else {
                tmap.put(d, 1);
            }
        }
        for (Character key: map.keySet()) {
            int mapv = map.get(key);
            int tmapv = tmap.get(key);
            if (mapv != tmapv) {
                System.out.println(tmapv);
                System.out.println(mapv);
                return false;
            }
        } 
        return true;
    }
}
公共类解决方案{
公共b