zoukankan      html  css  js  c++  java
  • 字符串问题:判断两个字符串是否互为变形词

    题目

      给定两个字符串 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 }
  • 相关阅读:
    【Java编程思想】13.字符串
    【Java编程思想】12.通过异常处理错误
    【Java编程思想】10.内部类
    【Java编程思想】11.持有对象
    【Java编程思想】9.接口
    【Java编程思想】8.多态
    【Java编程思想】7.复用类
    【Java编程思想】6.访问权限控制
    【Java编程思想】4.控制执行流程
    Ribbon、Feign、Hystrix使用时的超时时间设置问题
  • 原文地址:https://www.cnblogs.com/zlxyt/p/10529902.html
Copyright © 2011-2022 走看看