算法笔记(884. 两句话中的不常见单词,804. 唯一摩尔斯密码词,482. 密钥格式化,409. 最长回文串)

本文探讨了四个编程问题:找出两句话中不常见的单词计数、计算唯一摩尔斯密码词数量、格式化密钥字符串并解决最长回文串。展示了使用HashMap、Set和StringBuilder等数据结构的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目一:884. 两句话中的不常见单词

解法一:HashMap记录,StringBuilder转字符串数组

public String[] uncommonFromSentences2(String s1, String s2) {
        String[] split1 = s1.split(" ");
        String[] split2 = s2.split(" ");
        Map<String,Integer> map = new HashMap<>();
        for (int i=0;i<split1.length;i++){
            map.put(split1[i],map.getOrDefault(split1[i],0)+1);
        }
        for (int i=0;i<split2.length;i++){
            map.put(split2[i],map.getOrDefault(split2[i],0)+1);
        }
        StringBuilder sb = new StringBuilder();
        for (String s : map.keySet()) {
            if (map.get(s)==1){
                sb.append(s+"-");
            }
        }
        String s3 = sb.toString();
        if (s3.equals("")){
            return new String[]{};
        }
        s3 = s3.substring(0, s3.length() - 1);
        return s3.split("-");
    }

解法一:HashMap记录,ArrayList接收后转字符串数组

 public String[] uncommonFromSentences(String s1, String s2) {
        Map<String,Integer> map = new HashMap<>();
        String[] split1 = s1.split(" ");
        String[] split2 = s2.split(" ");

        for (int i=0;i<split1.length;i++){
            map.put(split1[i],map.getOrDefault(split1[i],0)+1);
        }
        for (int i=0;i<split2.length;i++){
            map.put(split2[i],map.getOrDefault(split2[i],0)+1);
        }

        List<String> list = new ArrayList<>();
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            if (entry.getValue()==1){
                list.add(entry.getKey());
            }
        }
        return list.toArray(new String[0]);
    }

题目二:804. 唯一摩尔斯密码词

解法一:两个解法差距不大一个是直接把密码设置为常量,一个是跟在方法里面

public static final String [] strArr =
            {".-","-...","-.-.","-..", ".","..-.","--.","....", "..",".---","-.-",".-..", "--","-.","---",".--.", "--.-",".-.","...","-", "..-","...-",".--", "-..-","-.--","--.."};

    public int uniqueMorseRepresentations(String[] words) {
        Set<String> set = new HashSet<>();
        for (String word : words) {
            StringBuilder sb = new StringBuilder();
            for (int i=0;i<word.length();i++){
                char c = word.charAt(i);
                sb.append(strArr[c-'a']);
            }
            set.add(sb.toString());
        }
        return set.size();
    }

解法二:每次调用都New一个Map

public int uniqueMorseRepresentations2(String[] words) {
        Map<Character,String> map = new HashMap<>();
        map.put('a',".-");map.put('b',"-...");map.put('c',"-.-.");map.put('d',"-..");map.put('e',".");map.put('f',"..-.");map.put('g',"--.");map.put('h',"....");map.put('i',"..");map.put('j',".---");map.put('k',"-.-");map.put('l',".-..");
        map.put('m',"--");map.put('n',"-.");map.put('o',"---");map.put('p',".--.");map.put('q',"--.-");map.put('r',".-.");map.put('s',"...");map.put('t',"-");
        map.put('u',"..-");map.put('v',"...-");map.put('w',".--");map.put('x',"-..-");map.put('y',"-.--");map.put('z',"--..");
        List<String> list = new ArrayList<>();
        for (String word : words) {
            char[] chars = word.toCharArray();
            StringBuilder sb = new StringBuilder();
            for (char aChar : chars) {
                sb.append(map.get(aChar));
            }
            if (!list.contains(sb.toString())) list.add(sb.toString());
        }
        return list.size();
    }

题目三:482. 密钥格式化

解法:拆掉字符串,除了-,其他的判断是否大写字母之后不是就转一下,

   public String licenseKeyFormatting(String s, int k) {
        StringBuilder sb = new StringBuilder();
        for (char c : s.toCharArray()) {
            if (c=='-') {
                continue;
            }
            sb.append((c>='a' && c <='z')?(char)(c-32):c);
        }
        int len = sb.length() - k;
        while (len > 0){
            sb.insert(len,'-');
            len -= k;
        }
        return sb.toString();
    }

题目四:409. 最长回文串

解法

public int longestPalindrome(String s) {
        Map<Character,Integer> map = new HashMap<>();
        for (char c : s.toCharArray()) {
            map.put(c,map.getOrDefault(c,0)+1);
        }
        int res = 0, odd = 0;
        for (Map.Entry<Character, Integer> entry : map.entrySet()) {
            int count = entry.getValue();
            int rem = count % 2;
            res += count - rem;
            if (rem == 1) odd = 1;
        }
        return res + odd;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值