利用哈希映射的思路来处理,记录子串在父串中每个字符出现的位置
时间O(nk)(k与父串中相应字符出现离散度有关,最差情况下k=m,即父串的长度),空间O(h)(h为字串离散度,本题为26)
public boolean canConstruct(String ransomNote, String magazine) { if (magazine.length()<ransomNote.length()) return false; // 本题的离散度只有小写字母26个 int[] res = new int[26]; for(char ch:ransomNote.toCharArray()){ // 利用indexof,一来找出字符,二来找出下标,题目要求只能出现一次,所以后续的查找需要向后进行 int index = magazine.indexOf(ch,res[ch-'a']); if(index==-1){ return false; } // 记录字符ch下一次查找的开始位置,注意+1 res[ch-'a']=index+1; } return true; }