Java 为什么下面可以确定str1和str2是否为字谜?
我正在阅读一段代码片段,我想知道为什么下面的代码会 检查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”,结果也应该是正确的,对吗
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