字符串问题:判断两个字符串是否互为变形词

题目

  给定两个字符串 str1 和 str2,如果 str1 和 str2 中出现的字符种类一样且每种字符出现的次数也一样,那么 str1 和 str2 互为变形词。请实现函数判断两个字符串是否互为变形词。

举例

  str1="123", str2="231", 返回 true

  str1="123", str2="2331", 返回 false

要求

  如果字符的种类为 M,str1 和 str2 的长度为 N,那么该方法的时间复杂度为 O(N), 空间复杂度为 O(M)

难度

  一星

解答

  如果字符串 str1 和 str2 长度不同,直接返回 false。如果长度相同,假设出现字符的编码值在 0~255 之间,那么闲申请一个长度为 256 的整型数组 map, map[a] = b 代表字符编码为 a 的字符出现了 b 次,初始时 map[0...255] 的值都是 0。然后遍历字符串 str1,统计每种字符出现的数量,比如遍历到字符 'a', 其编码值为 97, 则令 map[97]++。这样 map 就成了 str1 中每种字符的词频统计表。然后遍历字符串 str2, 每遍历到一个字符都在 map 中把词频减下来,比如遍历到字符 'a', 其编码值为 97,则令 map[97]--,如果减少之后的值小于 0,直接返回false,  如果遍历完 str2, map 中的值也没出现负值,则返回true。如果字符的类型很多, 可以用哈希表替代长度为 256 的整型数组。

  具体实现请参考下面代码中的  isDeformation 方法。

 1 import java.util.Map;
 2 import java.util.HashMap;
 3 
 4 public class Main {
 5     
 6     public static void main(String[] args) {
 7         System.out.println(new Main().isDeformation("123", "231"));//true
 8         System.out.println(new Main().isDeformation("123", "2331"));//false
 9         System.out.println(new Main().isDeformation("123", "221"));//false
10         
11         System.out.println(new Main().isDeformation2("123", "231"));//true
12         System.out.println(new Main().isDeformation2("123", "2331"));//false
13         System.out.println(new Main().isDeformation2("123", "221"));//false
14     }
15     
16     public boolean isDeformation(String str1, String str2){
17         if(str1 == null || str2 == null || str1.length()!= str2.length()) return false;
18         char[] chs1 = str1.toCharArray(), chs2 = str2.toCharArray();
19         int[] map = new int[256];
20         for(char ch : chs1){
21             map[ch]++;
22         }
23         for(char ch : chs2){
24             if(--map[ch] < 0){
25                 return false;
26             }
27         }
28         return true;
29     }
30     
31     //如果字符的类型很多, 可以用哈希表替代长度为 256 的整型数组
32     public boolean isDeformation2(String str1, String str2){
33         if(str1 == null || str2 == null || str1.length()!= str2.length()) return false;
34         char[] chs1 = str1.toCharArray(), chs2 = str2.toCharArray();
35         Map<Character, Integer> map = new HashMap<Character, Integer>();
36         for(char ch : chs1){
37             if(map.containsKey(ch)){
38                 int count = map.get(ch);
39                 map.put(ch, ++count);
40             }else{
41                 map.put(ch, 1);
42             }
43         }
44         for(char ch : chs2){
45             if(!map.containsKey(ch)) return false;
46             int count = map.get(ch);
47             if(--count < 0) return false;
48             map.put(ch, count);
49         }
50         return true;
51     }
52     
53 }
posted @ 2019-03-14 14:00  米突小搞羊  阅读(446)  评论(0编辑  收藏  举报