• lintcode:anagrams 乱序字符串


    题目

     乱序字符串

    给出一个字符串数组S,找到其中所有的乱序字符串(Anagram)。如果一个字符串是乱序字符串,那么他存在一个字母集合相同,但顺序不同的字符串也在S中。

    样例

    对于字符串数组 ["lint","intl","inlt","code"]

    返回 ["lint","inlt","intl"]

    注意

    所有的字符串都只包含小写字母

    解题

    感觉很简单,搞了近两个小时,写了下面的程序

    public class Solution {
        /**
         * @param strs: A list of strings
         * @return: A list of strings
         */
        public List<String> anagrams(String[] strs) {
            // write your code here
            List<String> list = new ArrayList<String>();
            if(strs.length  == 0 || strs ==null)
                return list;
            int i=0;
            int j=0;
            int k = -1;
            while(i<strs.length ){
                while(j< strs.length ){
                    if(compare(strs[i],strs[j])){
                        k=i;
                        break;
                    }else{
                        j++;
                    }
                }
                if(k==i) break;
                i++;
            }
            if(k==-1)
                return list;
            list.add(strs[k]);
            for( i=0;i<strs.length ;i++)
                if(i!=k && compare(strs[k],strs[i]))
                list.add(strs[i]);
            return list;
        }
        public boolean compare(String str1,String str2){
            HashMap<Character,Integer> map = new HashMap<Character,Integer>();
            if(str1.length()!= str2.length())
                return false;
            for(int i=0;i<str1.length();i++){
                char ch = str1.charAt(i);
                if(!map.containsKey(ch)){
                    map.put(ch,1);
                }else{
                    map.put(ch,map.get(ch)+1);
                }
            }
            for(int j=0;j<str2.length();j++){
                char ch = str2.charAt(j);
                if(!map.containsKey(ch)){
                    return false;
                }else{
                    map.put(ch,map.get(ch)-1);
                    if(map.get(ch)<0)
                        return false;
                }
            }
            return true;
        }
    }
    Java Code

    然而可以有多个

    输入
    ["tea","","eat","","tea",""]
    输出
    ["eat","tea","tea"]
    期望答案
    ["","","","eat","tea","tea"]

    简书给的程序很好,或者说作者很会想,把由相同字母组成的单词映射到同一个key值

    这里,对单词排序后,统计出现的次数,也是让映射的key值唯一

    programcreek 也是排序的方法

    Java

    public class Solution {
        /**
         * @param strs: A list of strings
         * @return: A list of strings
         */
        public List<String> anagrams(String[] strs) {
            // write your code here
            List<String> list = new ArrayList<String>();
            if(strs == null || strs.length ==0)
                return list;
            Map<String,Integer> map = new HashMap<String,Integer>();
            String[] strs2 = new String[strs.length];
            for(int i=0;i< strs.length;i++){
                char[] ch = strs[i].toCharArray();
                Arrays.sort(ch);
                strs2[i] =  String.valueOf(ch);
                if(!map.containsKey(strs2[i])){
                    map.put(strs2[i],1);
                }else{
                    map.put(strs2[i],map.get(strs2[i]) + 1);
                }
            }
            for(int i=0;i<strs.length;i++){
                if(map.get(strs2[i]) >1)
                    list.add(strs[i]);
            }
            // if(strs.length >=6)
            //     System.out.println(0);
            return list;
        }
    }
    Java Code
  • 相关阅读:
    Java8 Optional使用方式
    ABAC框架-casbin
    Java数据脱敏(手机号|邮箱号|身份证号|银行卡号)
    使用OpenOffice将office文件转为pdf
    在线审批流设计
    Java 将带逗号的字符串转为List
    Java8 lambda常用操作
    Markdown合并单元格
    本博客已搬迁至rcst.xyz
    涂色(题解)
  • 原文地址:https://www.cnblogs.com/bbbblog/p/5103724.html
Copyright © 2020-2023  润新知