这是我为同构字符串制作的半代码,
public boolean isIsomorphic(String s, String t) {
String[] ss=s.split("");
String[] tt=t.split("");
HashMap<String, Integer> smap=new HashMap<>();
HashMap<String, Integer> tmap=new HashMap<>();
int tint,sint;
for(int i=0;i<ss.length;i++){
if(!smap.containsKey(ss[i])){
smap.put(ss[i], 1);
}else{
sint=smap.get(ss[i]);
smap.put(ss[i], sint++);
}
}
for(int i=0;i<tt.length;i++){
if(!tmap.containsKey(tt[i])){
tmap.put(tt[i], 1);
}else{
tint=tmap.get(tt[i]);
tmap.put(tt[i], tint++);
}
}
//below space to iterate and check if both hashmap values are sequentially
}
下面是我找到的解决方案,我打算使用这个逻辑,但我无法比较两个哈希图,因为两者都有不同的键...... 这里两个哈希映射中的所有键都不同,并且值序列可能相同,这就是我想检查的......如果所有值都按顺序相同或相等。
for (Map.Entry<String, Object> entry : map.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
// ...
}
我将解决您提出的问题:如何计算两个
HashMap
对象的内容。这可能会也可能不会解决验证两个String
对象同构的问题。
在回答这个问题之前,我想先偏离主题两次。
首先介绍一个可以辅助你测试调试的方法:
public static <K,V> String mapToString (Map<K,V> map) {
StringBuilder out = new StringBuilder ();
out.append('[');
Set<Map.Entry<K,V>> set = map.entrySet();
for (Map.Entry<K,V> entry : set) {
out.append (entry.getKey()).append (':')
.append (entry.getValue()).append (',');
}
if (out.length() == 1) {
out.append (']');
} else {
out.setCharAt(out.length()-1, ']');
}
return out.toString ();
}
接下来,我想扩展我的评论:不要重复自己。在您问题中显示的代码中,您有两个部分加载
Map
,每个 String
参数一个部分。您可以将其简化为一个方法,然后调用它两次。这是与您的代码类似的代码,但作为一种方法:
public static LinkedHashMap<Character, Integer> loadMap (String str) {
LinkedHashMap <Character, Integer> map = new LinkedHashMap <> ();
char ss;
int count = 0;
for(int i=0;i<str.length();i++){
ss = Character.toLowerCase(str.charAt(i));
if(!map.containsKey(ss)){
map.put(ss, 1);
}else{
count=map.get(ss);
map.put(ss, count++);
}
}
System.out.println (mapToString (map));
return map;
}
HashMap<Character, Integer>
而不是 HashMap<String, Integer>
。Character
而不是 String
作为键,也没有充分的理由使用 charAt (int index)
的 String
方法而不是数组。这是我的偏好。String
API 提供了 toCharArray()
方法。现在,解决这个问题:
LinkedHashMap
。链接哈希映射是也具有双向链表的映射。链表按插入顺序维护条目。
虽然您想要迭代
Map
对象的内容,但 LinkedHashMap
API 不提供 get(int index)
或其他支持使用 for
循环进行迭代的方法。它也不直接提供 iterator
方法。
但是,它确实提供了这些方法:
public Set<Map.Entry<K,V>> entrySet()
public Set<K> keySet()
public Collection<V> values()
Set
是 Collection
的一种类型。还有一个Collection
是Iterable
。
Collection
的 LinkedHashMap
视图。Map
复制到 new Set
或 new Collection
对象。Map
视为 Set
或 Collection
。Map
对象的包装。既然您知道这些方法的存在,并且可以找到 API 文档,那么您想如何使用它们就取决于您了。这是一种方法,但它与使用
Map<Character, Integer>
: 一致
public static boolean isIsomorphic(String s, String t) {
if (s.length() != t.length()) { return false; }
LinkedHashMap <Character, Integer> smap = loadMap (s);
LinkedHashMap <Character, Integer> tmap = loadMap (t);
if (smap.size() != tmap.size()) { return false; }
Collection<Integer> tValues = tmap.values();
Collection<Integer> sValues = smap.values ();
List<Integer> tList = new ArrayList<> ();
tList.addAll(tValues);
List<Integer> sList = new ArrayList<> ();
sList.addAll (sValues);
return sList.equals(tList);
}
注意: 我仅解决了顺序比较一对
HashMaps
的内容的问题。如果我对同构字符串问题的理解是正确的,则此代码将产生误报。也就是说,当一对 Strings
不严格同构时,它可以将它们识别为同构。我将让您找出原因,找到误报的示例。