[LintCode]判断一个字符串是否包含另一个字符串的所有字符
问题描述:
比较两个字符串A和B,确定A中是否包含B中所有的字符。字符串A和B中的字符都是 大写字母。
样例
给出 A = "ABCD"
B = "ACD"
,返回 true
给出 A = "ABCD"
B = "AABC"
, 返回 false
注意事项
在 A 中出现的 B 字符串里的字符不需要连续或者有序。
问题分析:
实质上利用的是哈希表的思想。只有大写字母,一共26个,遍历A的时候,往里面压,遍历B的时候,往外边弹,如果不够弹,则不包含。
问题解决:
一种比较麻烦的解法:
public class Solution { /** * @param A : A string includes Upper Case letters * @param B : A string includes Upper Case letter * @return : if string A contains all of the characters in B return true else return false */ public boolean compareStrings(String A, String B) { // write your code here Map<String, Integer> map = new HashMap<String, Integer>(); for (int i = 0; i < 26; i++) { map.put((char)(i + 'A') + "", 0); } for (int i = 0; i < A.length(); i++) { String key = A.charAt(i) + ""; Integer count = map.get(key); map.put(key, ++count); } for (int i = 0; i < B.length(); i++) { String key = B.charAt(i) + ""; Integer count = map.get(key); if (map.containsKey(key)) { map.put(key, --count); } if (count < 0) { return false; } } return true; } }
一种简单的解法(本质一样):
public class Solution { /** * @param A : A string includes Upper Case letters * @param B : A string includes Upper Case letter * @return : if string A contains all of the characters in B return true else return false */ public boolean compareStrings(String A, String B) { // write your code here int[] index = new int[26]; for (int i = 0; i < A.length(); i++) { index[A.charAt(i) - 'A']++; } for (int i = 0; i < B.length(); i++) { index[B.charAt(i) - 'A']--; if(index[B.charAt(i) - 'A'] < 0){ return false; } } return true; } }