1.有效的字母异位词
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
有效的字母异位词
思路:
1.创建一个大小为26的数组,用来记录每个小写字母出现的次数
2.分别收集两个字符串中的字母
3.看数组是否为0
class Solution {
public boolean isAnagram(String s, String t) {
int[] record = new int[26];
//收集s中各个字母的数量和种类,放在数组中
for(char ch:s.toCharArray()){
record[ch-'a']+=1;
}
//与t中各个字母的数量和种类相比较
for(char ch:t.toCharArray()){
record[ch-'a']-=1;
}
//看当前数组元素是否为0
for(int i : record){
if(i!=0) return false;
}
return true;
}
}
2.赎金信
给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。如果可以,返回 true ;否则返回 false 。magazine 中的每个字符只能在 ransomNote 中使用一次。
思路:同上
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
int[] record =new int[26];
//收集ransomNote的字符数量和种类
for(char ch:ransomNote.toCharArray()){
record[ch-'a']+=1;
}
//释放magazine的字符和数量
for(char ch:magazine.toCharArray()){
record[ch-'a']-=1;
}
//遍历record中的字母个数
for(int i :record){
if(i>0) return false;
}
return true;
}
}
3.字母异位词分组
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。
1.创建一个哈希表
2.将字符串转换为字符数组,并按字母表顺序排序。
3.将排序后的字符数组转换成字符串,并作为哈希表的key值
4.比较哈希表是否有key值,若没有,则将key值放入表中
5.将该key对应的value值放入表中
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
if(strs==null||strs.length==0){
return new ArrayList();
}
Map<String, List> map = new HashMap<String ,List>();
for(String s : strs){
//将字符串转换为字符数组
char[] chs = s.toCharArray();
//将字符数组按照字母顺序排序
Arrays.sort(chs);
//将排序后的字符串作为哈希表中的key值
String key = String.valueOf(chs);
//判断哈希表中是否有key值
if(!map.containsKey(key)){
map.put(key,new ArrayList());
}
//将该字符串放在对应key的list中
map.get(key).add(s);//根据key获得相应的val,然后放在list中
}
return new ArrayList(map.values());
}
}
4.找到字符串中所有字母异位词
给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。
思路:
1.创建两个大小为26的数组,用于记录字母出现的数量
2.以p的长度为基准,分别统计该长度范围内字母的数量
3.倘若两个数组equals,将0添加到list中
4.记录s中剩下长度的数组,并且一边记录新字母数量,一边删除旧字母。
5.倘若两个数组相等,将当前下标放入list中。
class Solution {
public List<Integer> findAnagrams(String s, String p) {
List<Integer> ans = new ArrayList();//用于存放答案
int[] sRecord = new int[26];
int[] pRecord = new int[26];
int sLen = s.length();
int pLen = p.length();
if(sLen<pLen){
return ans;
}
//统计字符串中的字母数量,分别放在两个数组中,先以较短的为基准
for(int i =0;i<pLen;i++){
sRecord[s.charAt(i)-'a']++;
pRecord[p.charAt(i)-'a']++;
}
//如果两个数组完全相同,则输出0位置
if(Arrays.equals(sRecord,pRecord)){
ans.add(0);
}
//统计s中剩下的字符数量
for(int i =pLen;i<sLen;i++){
sRecord[s.charAt(i-pLen)-'a']--;//清空s数组
sRecord[s.charAt(i)-'a']++;
//如果此时两个数组完全相等
if(Arrays.equals(sRecord,pRecord)){
ans.add(i-pLen+1);
}
}
return ans;
}
}