leetcode-解决字母异位词
2022/9/3 23:25:09
本文主要是介绍leetcode-解决字母异位词,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
引言
本篇文章分别对leetcode题目的242、49和438的题目进行解答。
有效的字母异位词
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
示例 1:
输入: s = "anagram", t = "nagaram" 输出: true
示例 2:
输入: s = "rat", t = "car" 输出: false
提示:
- 1 <= s.length, t.length <= 5 * 104
- s 和 t 仅包含小写字母
思路
比较两个字符串出现的字母个数是否相同,相同返回true,不同返回false。我们可以定义一个长度为26的int数组,0-25分别表示a-z。首先用该数组记录s字母个数,然后遍历t时,只需要将t[i]字符所对应的位置减一,如果整个数组都是0,则是异位词。
代码
public boolean isAnagram(String s, String t) { int[] record = new int[26]; for(char c: s.toCharArray()){ record[c - 'a']++; } for(char c: t.toCharArray()){ record[c - 'a']--; } for (int i = 0; i < 26; i++){ if (record[i] != 0){ return false; } } return true; }
字母异位词分组
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"] 输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例2:
输入: strs = [""] 输出: [[""]]
示例 3:
输入: strs = ["a"] 输出: [["a"]]
提示
- 1 <= strs.length <= 104
- 0 <= strs[i].length <= 100
- strs[i] 仅包含小写字母
思路
将所有字符串都转换成字符数组,然后进行排序,最后在调用Arrays.sort()变成字符串。如果是字母异位词,那么最后的字符串都是一样的。例如"abc","bca","cab"最后会变成"abc"。因此我们可以用HashMap来存储,以排序好的字符串作为key,以List作为value。当map里有key值时,存入该排序前的字符串。否则map添加该key值。
代码
public List<List<String>> groupAnagrams(String[] strs) { HashMap<String,List<String>> map = new HashMap<>(); for (String str : strs) { // 先将每个字符串转换成字符数组 char[] ch = str.toCharArray(); // 对字母进行排序 Arrays.sort(ch); // 将排序好的字母转换成字符串 String s = String.valueOf(ch); if (map.containsKey(s)){ map.get(s).add(str); }else { List<String> temp = new ArrayList<>(); temp.add(str); map.put(s,temp); } } return new ArrayList(map.values()); }
438找到字符串中所有字母异位词
给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。
示例 1:
输入: s = "cbaebabacd", p = "abc" 输出: [0,6] 解释: 起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。 起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。
示例 2:
输入: s = "abab", p = "ab" 输出: [0,1,2] 解释: 起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。 起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。 起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。
思路1
和上题一样,循环遍历s子串,然后对子串和p进行排序,排序后相等则加入子串的首位置。但效率不高
代码
public List<Integer> findAnagrams(String s, String p) { int lens = s.length(); int lenp = p.length(); if (lenp > lens){ return new ArrayList<>(); } char[] pChar = p.toCharArray(); Arrays.sort(pChar); p = String.valueOf(pChar); List<Integer> res = new ArrayList<>(); for (int i = 0; i <= lens - lenp; i++){ String temp = s.substring(i,i + lenp); char[] ch = temp.toCharArray(); Arrays.sort(ch); temp = String.valueOf(ch); if (p.equals(temp)){ res.add(i); } } return res; }
思路2
双指针构建滑动窗口。和242题一样,不同之处是需要定义两个数组。一个记录p数组,一个记录s数组。然后采用Arrays.equals(target,windows)来判断两个数组是否相等。详细看代码
代码
public List<Integer> findAnagrams(String s, String p) { List<Integer> res = new ArrayList<>(); int[] target = new int[26]; // 记录p字母个数 for (char c: p.toCharArray()){ target[c - 'a']++; } int lens = s.length(); int lenp = p.length(); // 快慢指针 int slow = 0; int right = 0; // 记录子串字母个数 int[] windows = new int[26]; while (right < lens){ windows[s.charAt(right) - 'a']++; if (right - slow + 1 == lenp){ // 判断数组是否相等 if (Arrays.equals(target,windows)){ res.add(slow); } windows[s.charAt(slow++) - 'a']--; } right++; } return res; }
这篇关于leetcode-解决字母异位词的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享