给定string stringA和string stringB,编写程序确认两字符串包含的字符是否完全相同,注意大小写为不同字符,且考虑字符串中的空格,返回一个bool,代表两串是否由一样的字符组成。保证两串的长度都小于等于5000。
给定string stringA和string stringB,编写程序确认两字符串包含的字符是否完全相同,注意大小写为不同字符,且考虑字符串中的空格,返回一个bool,代表两串是否由一样的字符组成。保证两串的长度都小于等于5000。
"This is nowcoder","is This nowcoder"
true
"Here you are","Are you here"
false
import java.util.*; public class Same { public boolean checkSam(String stringA, String stringB) { // write code here if(stringA == null || stringB == null || stringA.length()!=stringB.length()) return false; HashMap<Character,Integer> map = new HashMap<Character,Integer>(); for(int i=0;i<stringA.length();i++){ if(!map.containsKey(stringA.charAt(i))){ map.put(stringA.charAt(i),1); }else map.put(stringA.charAt(i),map.get(stringA.charAt(i))+1); } for(int i=0;i<stringA.length();i++){ if(!map.containsKey(stringB.charAt(i)) || map.get(stringB.charAt(i))==0){ return false; }else map.put(stringB.charAt(i),map.get(stringB.charAt(i))-1); } return true; } }
package june.code.byhehe.book.GoldBook; import java.util.Arrays; import java.util.Comparator; public class CM3MakeSure { public static void main(String[] args) { CM3 cm3 = new CM3(); String a = "This is nowcoder"; String b = "is This nowcoder"; System.out.println(cm3.checkSam(a, b)); System.out.println(cm3.checkSam2(a,b)); System.out.println(cm3.checkSam3(a,b)); } } class CM3{ // 考虑使用 256 长度进行判断 或者使用 map 进行判断 // 空间:O(n) 时间:O(n) public boolean checkSam(String stringA, String stringB) { // write code here // 考虑判断长度 if(stringA.length() != stringB.length()) return false; int[] map1 = new int[256]; int[] map2 = new int[256]; for (int i = 0; i < stringA.length(); i++) { char c = stringA.charAt(i); char c2 = stringB.charAt(i); map1[c]++; map2[c2]++; } for (int i = 0; i < 256; i++) { if(map1[i]!=map2[i]) return false; } return true; } // 重排单词 进行比较 // 空间:O(n) 时间:O(nlogn) public boolean checkSam2(String stringA, String stringB) { String[] splitA = stringA.split(" "); String[] splitB = stringB.split(" "); if(splitA.length!=splitB.length) return false; Arrays.sort(splitA, new Comparator<String>() { @Override public int compare(String o1, String o2) { return o1.compareTo(o2); } }); Arrays.sort(splitB, new Comparator<String>() { @Override public int compare(String o1, String o2) { return o1.compareTo(o2); } }); for (int i = 0; i < splitA.length; i++) { if(!splitA[i].equals(splitB[i])) return false; } return true; } // 还有一种方法 基于上面的重排单词 , 由于题目并未严格要求 以单词为基准, 所以我们可以重排所有字符进行比较 // 空间:O(n) 时间:O(n) public boolean checkSam3(String stringA, String stringB) { // 需要借助 char 数组 if(stringA.length()!=stringB.length()) return false; char[] chars1 = stringA.toCharArray(); char[] chars2 = stringB.toCharArray(); Arrays.sort(chars1); Arrays.sort(chars2); // 直接调用 Arrays.equals 方法来进行比较 return Arrays.equals(chars1, chars2); /* // 没必要 再写 其实 Arrays 里面源码就是这样写的 for (int i=0; i<length; i++) if (a[i] != a2[i]) return false; */ } }
private boolean equals(String a,String b){ if(a==b){ return true; } if(a==null||b==null){ return false; } if(a.length()!=b.length()){ return false; } int[] array=new int[256]; for(int i=0;i<a.length();i++){ array[a.charAt(i)]++; array[b.charAt(i)]--; } for(int i=0;i<array.length;i++){ if(array[i]!=0){ return false; } } return true; }
public class Same { public boolean checkSam(String stringA, String stringB) { if(stringA.length()!=stringB.length()){return false;} Map<Character,Integer> mapa = statCharsFrequency(stringA); Map<Character,Integer> mapb = statCharsFrequency(stringB); // 通过遍历key判断该key出现的次数是否相同 for(Character key:mapa.keySet()) { System.out.println("Key: "+key+" Value: "+mapa.get(key)); if (!mapa.get(key).equals(mapb.get(key))) { return false; } } return true; } public static Map<Character,Integer> statCharsFrequency(String string){ Map<Character,Integer> map = new HashMap<Character,Integer>(); char[] arr = string.toCharArray(); for (char ch : arr) { if (map.containsKey(ch)) { Integer old = map.get(ch); map.put(ch, old + 1); } else { map.put(ch,1); } } return map; } }
代码: int lengthA = stringA.length(); int lengthB = stringA.length(); if (lengthA != lengthB) return false; HashMap<Character, Integer> hmA = new HashMap<Character, Integer>(); char c; for (int i = 0; i < lengthA; i++) { c = stringA.charAt(i); if (!hmA.containsKey(c)) { hmA.put(c, 1); } else { hmA.put(c, hmA.get(c) + 1); } } HashMap<Character, Integer> hmB = new HashMap<Character, Integer>(); for (int i = 0; i < lengthB; i++) { c = stringB.charAt(i); if (!hmB.containsKey(c)) { hmB.put(c, 1); } else { hmB.put(c, hmB.get(c) + 1); } } return hmA.equals(hmB);
统计每个字符和出现的次数,存入HashMap,比较HashMap是否相同。
public boolean checkSam(String stringA, String stringB) { boolean res = true; for(int i = 0; i<stringA.length() ; i++) { for(int j = 0 ; j<stringB.length() ; j++) { if(!stringB.contains(stringA.substring(i, i+1)) ) { res = false; break; } } } return res; } 用python一行代码就是实现了,人生苦短啊!
public boolean checkSam(String stringA, String stringB) { // write code here if (stringA.length() != stringB.length()){ return false; } if (stringA.equals(stringB)){ return true; } char[] charsA = stringA.toCharArray(); Arrays.sort(charsA); char[] charsB = stringB.toCharArray(); Arrays.sort(charsB); return Arrays.equals(charsA, charsB); }
import java.util.*; public class Same { public boolean checkSam(String stringA, String stringB) { // 长度不同肯定不行 if (stringA.length()!=stringB.length()){ return false; } int len = stringA.length(); int res = 0; // 长度相同就直接遍历取异或 for (int i=0; i<len; i++){ char a = stringA.charAt(i); char b = stringB.charAt(i); res = res^(int)a; res = res^(int)b; } // 值为0表示可以重排实现 if (res==0) return true; else { return false; } } }
//方法一:o(n)按位于 这方法有误,虽然能AC public boolean checkSam(String stringA, String stringB) { if(stringA==null&&stringB==null) return true; if(stringA==null||stringB==null) return false; if(stringA.length()!=stringB.length()) return false; StringBuffer sbA=new StringBuffer(stringA); StringBuffer sbB=new StringBuffer(stringB); int result=0; for(int i=0;i<stringA.length();i++){ result=sbA.charAt(i)^sbB.charAt(i)^result; } if(result!=0) return false; return true; } //方法二,基于hash表, public boolean checkSam(String stringA, String stringB) { if(stringA==null&&stringB==null) return true; if(stringA==null||stringB==null) return false; if(stringA.length()!=stringB.length()) return false; HashMap<Character,Integer> mapA=new HashMap<Character,Integer>(); HashMap<Character,Integer> mapB=new HashMap<Character,Integer>(); for(int i=0;i<stringA.length();i++){ mapA.put(stringA.charAt(i),mapA.containsKey(stringA.charAt(i))?mapA.get(stringA.charAt(i))+1:0); mapB.put(stringB.charAt(i),mapB.containsKey(stringB.charAt(i))?mapB.get(stringB.charAt(i))+1:0); } for(char ch:mapA.keySet()) if(mapA.get(ch)!=mapB.get(ch)) return false; return true; } //方法三,定义两个数组,原理类似hash表 public boolean checkSam(String stringA, String stringB) { if(stringA==null&&stringB==null) return true; if(stringA==null||stringB==null) return false; if(stringA.length()!=stringB.length()) return false; int[] arrayA=new int[256]; int[] arrayB=new int[256]; HashMap<Character,Integer> mapB=new HashMap<Character,Integer>(); for(int i=0;i<stringA.length();i++){ arrayA[stringA.charAt(i)]++; arrayB[stringB.charAt(i)]++; } for(int i=0;i<arrayA.length;i++) if(arrayA[i]!=arrayB[i]) return false; return true; }
} On时间度最短的- -
import java.util.*; public class Same { public boolean checkSam(String stringA, String stringB) { if(stringA.length()!=stringB.length()) return false; HashMap<Character,Integer> map=new HashMap<Character,Integer>(); for(int i=0;i<stringA.length();i++){ if(map.containsKey(stringA.charAt(i))) map.put(stringA.charAt(i),map.get(stringA.charAt(i))+1); else map.put(stringA.charAt(i),1); } for(int i=0;i<stringB.length();i++){ if(map.containsKey(stringB.charAt(i))){ map.put(stringB.charAt(i),map.get(stringB.charAt(i))-1); if(map.get(stringB.charAt(i))==0) map.remove(stringB.charAt(i)); } else return false; } return true; } }
import java.util.*; public class Same { public boolean checkSam(String stringA, String stringB) { //特殊输入判断 if (stringA == null || stringB == null ||stringA.length() != stringB.length()) { return false; } //思路:1. 将stringA转换为数组,保存字符串中的每个字符。 //2. 然后将每个字符加到list, //3. 同理,转换字符串stringB为数组 //4. 遍历数组b中的每个字符,如果list中存在,那么,移除。 //5. 如果list为空,那么返回true。 ArrayList<Character> list = new ArrayList<>(); char[] a = stringA.toCharArray(); char[] b = stringB.toCharArray(); for (int i = 0; i < a.length; i ++) { list.add(a[i]); } for (int i = 0; i < b.length; i ++) { if (list.contains(b[i])) { list.remove(list.indexOf(b[i])); } } return list.isEmpty(); } }
import java.util.*; public class Same { public boolean checkSam(String stringA, String stringB) { //统计stringA和strngB各字符出现的次数,如果每个字符出现的次数 // 相同,则返回true.各字符以ASCII码表示 //特殊输入判断 if (stringA == null || stringB == null ||stringA.length() != stringB.length()) { return false; } int[] strA = new int[256]; int[] strB = new int[256]; for (int i = 0; i < stringA.length(); i ++) { strA[stringA.charAt(i)] ++; strB[stringB.charAt(i)] ++; } for (int i = 0; i < 256; i ++) { if (strA[i] != strB[i]) return false; } return true; } }
import java.util.*; public class Same { public boolean checkSam(String stringA, String stringB) { //特殊输入判断 if (stringA == null || stringB == null ||stringA.length() != stringB.length()) { return false; } char[] a1 = stringA.toCharArray(); char[] a2 = stringB.toCharArray(); Arrays.sort(a1); Arrays.sort(a2); return Arrays.equals(a1, a2); } }
import java.util.*; public class Same { public boolean checkSam(String stringA, String stringB) { // write code here HashMap<Character, Integer> hashMapA= new HashMap<Character, Integer>(); HashMap<Character, Integer> hashMapB= new HashMap<Character, Integer>(); if (stringA.length() != stringB.length()) return false; for(int i=0; i<stringA.length();i++) { hashMapA.put(stringA.charAt(i), 0); } for(int i=0; i<stringA.length();i++) { int j= hashMapA.get(stringA.charAt(i)); hashMapA.put(stringA.charAt(i), j++); } for(int i=0; i<stringB.length();i++) { hashMapB.put(stringB.charAt(i), 0); } for(int i=0; i<stringB.length();i++) { int j= hashMapB.get(stringB.charAt(i)); hashMapB.put(stringB.charAt(i), j++); } /*for (Map.Entry<Character, Integer> entry : hashMapA.entrySet()) { entry.getKey(); entry.getValue(); }*/ for(int i=0; i<stringA.length();i++) { if (hashMapA.get(stringA.charAt(i))!= hashMapB.get(stringA.charAt(i))) return false; } return true; } } O(n)的时间复杂度