【Leetcode】819. Most Common Word

題目地址:

https://leetcode.com/problems/most-common-word/

給定一個英文段落,單詞之間以標點符號空格等分隔,再給定一個字符串數組,要求求出段落中不在數組裏的出現次數最多的單詞。單詞不分大小寫,數組裏的字符串保證是小寫。

用前後雙指針。每次分隔出一個單詞後就加進哈希表,記錄一下單詞出現的次數。代碼如下:

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

public class Solution {
    public String mostCommonWord(String paragraph, String[] banned) {
        String res = "";
        int maxLen = 0;
        Map<String, Integer> map = new HashMap<>();
        int i = 0;
        while (i < paragraph.length()) {
        	// 找到第一個是字母的字符
            while (i < paragraph.length() && !Character.isLetter(paragraph.charAt(i))) {
                i++;
            }
            // 如果找到了末尾,說明找完了,跳出循環
            if (i == paragraph.length()) {
                break;
            }
            // 從下一個字符開始找第一個不是字母的
            int j = i + 1;
            while (j < paragraph.length() && Character.isLetter(paragraph.charAt(j))) {
                j++;
            }
            // 分割出單詞,轉換爲小寫,加進哈希表
            String cur = paragraph.substring(i, j).toLowerCase();
            map.put(cur, map.getOrDefault(cur, 0) + 1);
            // 找下一個單詞
            i = j + 1;
        }
        
        // 開一個哈希表存ban掉的單詞,方便判斷一個單詞有沒有ban掉
        Set<String> set = new HashSet<>();
        for (String s : banned) {
            set.add(s);
        }
        
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            if (!set.contains(entry.getKey()) && entry.getValue() > maxLen) {
                res = entry.getKey();
                maxLen = entry.getValue();
            }
        }
        
        return res;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章