第 24 课

  • [888. 公平的糖果棒交换](https://leetcode-cn.com/problems/fair-candy-swap/)
  • [720. 词典中最长的单词](https://leetcode-cn.com/problems/longest-word-in-dictionary/)


888. 公平的糖果棒交换

class Solution:
    def fairCandySwap(self, aliceSizes: List[int], bobSizes: List[int]) -> List[int]:
        a, b = sum(aliceSizes), sum(bobSizes)
        c, d = aliceSizes, set(bobSizes)
        for i in c:                    
            j = (b - a)//2 + i            
            if j in d:
                return [i, j]
class Solution {
    public int[] fairCandySwap(int[] aliceSizes, int[] bobSizes) {
        int a = 0, b = 0;
        for (int x : aliceSizes) a += x;
        Set d = new HashSet();
        for (int x : bobSizes){
            b += x;
            d.add(x);
        }
        int delta = (b - a) / 2;
        for (int i : aliceSizes){
            int j = delta + i;
            if (d.contains(j)) return new int[]{i, j};
        }
        return new int[2];
    }
}

720. 词典中最长的单词

class Solution(object):
    def longestWord(self, words):
        wordset = set(words)
        words.sort(key = lambda x: (-len(x), x))
        for word in words:
            if all(word[:k] in wordset for k in range(1, len(word))):
                return word

        return ""
            
        # words.sort(key=lambda x: (-len(x), x), reverse=True)
        # ans = ""
        # candidates = {""}
        # for word in words:
        #     if word[:-1] in candidates:
        #         ans = word
        #         candidates.add(word)
        # return ans
class Solution {
    public String longestWord(String[] words) {
        Set<String> set = new HashSet<>();
        for (String w : words) set.add(w);
        Arrays.sort(words);  // 先按字母升序排序再按长度降序排列
        Arrays.sort(words, (a, b) -> b.length() - a.length());
        sign:
        for (String word : words){
            for (int i = 1; i < word.length(); i++){
                if (!set.contains(word.substring(0, i))) continue sign;
            }
            return word;
        }
        return "";
    }
}

class Solution {
    public String longestWord(String[] words) {
        Arrays.sort(words, (a, b) -> { // 升序
            if (a.length() != b.length()) return a.length() - b.length();            
            return b.compareTo(a); // 相同长度下把字典序较大的排在前面
        });

        String ans = "";
        Set<String> set = new HashSet<>();
        set.add("");
        for (String word : words) {
            if (set.contains(word.substring(0, word.length() - 1))) {
                ans = word;                
                set.add(word); // 注意是逐步多一,所以,这个添加要放在 if 里面
            }
        }
        return ans;
    }
}