移除字母异位词后的结果数组

给你一个下标从 0 开始的字符串 words ,其中 words[i] 由小写英文字符组成。

在一步操作中,需要选出任一下标 i ,从 words 中 删除 words[i] 。其中下标 i 需要同时满足下述两个条件:

0 < i < words.length
words[i - 1] 和 words[i] 是 字母异位词 。
只要可以选出满足条件的下标,就一直执行这个操作。

在执行所有操作后,返回 words 。可以证明,按任意顺序为每步操作选择下标都会得到相同的结果。

字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。例如,"dacb" 是 "abdc" 的一个字母异位词。

示例 1:

输入:words = ["abba","baba","bbaa","cd","cd"]
输出:["abba","cd"]
解释:
获取结果数组的方法之一是执行下述步骤:

  • 由于 words[2] = "bbaa" 和 words[1] = "baba" 是字母异位词,选择下标 2 并删除 words[2] 。
    现在 words = ["abba","baba","cd","cd"] 。
  • 由于 words[1] = "baba" 和 words[0] = "abba" 是字母异位词,选择下标 1 并删除 words[1] 。
    现在 words = ["abba","cd","cd"] 。
  • 由于 words[2] = "cd" 和 words[1] = "cd" 是字母异位词,选择下标 2 并删除 words[2] 。
    现在 words = ["abba","cd"] 。
    无法再执行任何操作,所以 ["abba","cd"] 是最终答案。
    示例 2:

输入:words = ["a","b","c","d","e"]
输出:["a","b","c","d","e"]
解释:
words 中不存在互为字母异位词的两个相邻字符串,所以无需执行任何操作。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/find-resultant-array-after-removing-anagrams
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

屎山代码,又臭又长,因为想删除某段内容,所以转换了list进行操作

class Solution {
    public List<String> removeAnagrams(String[] words) {
        //快慢指针遍历,当频率一致则代表是字母异位词
        int fast = 0, lows = 1;
        List<String> list = Arrays.asList(words);
        List<String> arrList = new ArrayList(list);
        while(fast<lows&&lows<arrList.size()){
            int[] letter1 = new int[26];
            int[] letter2 = new int[26];
            for(int i=0;i<arrList.get(fast).length();i++){
                letter1[arrList.get(fast).charAt(i)-'a']++;
            }
            for(int j=0;j<arrList.get(lows).length();j++){
                letter2[arrList.get(lows).charAt(j)-'a']++;
            }
            if(Arrays.equals(letter1,letter2)) {
                arrList.remove(lows);
            }else{
                fast = lows;
                lows++;
            }
        }
        return arrList;
    }
}

优化了不要数组转list再进行增删,直接添加进一个新的list

class Solution {
    public List<String> removeAnagrams(String[] words) {
        //快慢指针遍历,当频率一致则代表是字母异位词
        //不考虑删除,新建一个List返回就行
        int fast = 0, lows = 1;
        List<String> arrList = new ArrayList<>();
        arrList.add(words[fast]);
        while(fast<lows&&lows<words.length){
            int[] letter1 = new int[26];
            int[] letter2 = new int[26];
            for(int i=0;i<words[fast].length();i++){
                letter1[words[fast].charAt(i)-'a']++;
            }
            for(int j=0;j<words[lows].length();j++){
                letter2[words[lows].charAt(j)-'a']++;
            }
            if(Arrays.equals(letter1,letter2)) {
                lows++;
            }else{
                arrList.add(words[lows]);
                fast = lows;
                lows++;
            }
        }
        return arrList;
    }
}

不比较频率,比较前后字符串排序后是否一致

class Solution {
    public List<String> removeAnagrams(String[] words) {
        //不考虑删除,新建一个List返回就行
        //异位词:排序后跟之前相等,我们只需要比较前后是否相等
        List<String> list = new ArrayList<>();
        String lastString = "";
        for(String word : words){
            String sortString = sort(word);
            if(!sortString.equals(lastString)){
                list.add(word);
                lastString = sortString;
            }
        }
       return list;
    }
    // 字典排序重新排列单词
    public static String sort(String str) {
        char[] words = str.toCharArray();
        Arrays.sort(words);
        return new String(words);
    }
}
posted @ 2023-07-24 19:52  网抑云黑胶SVIP用户  阅读(4)  评论(0编辑  收藏  举报