1.問題描述app
Example 1: Input: A = "this apple is sweet", B = "this apple is sour" Output: ["sweet","sour"] Example 2: Input: A = "apple apple", B = "banana" Output: ["banana"]
要求:this
- 某個單詞在它本身所在的句子中僅出現一次。
- 某個單詞在另一個句子中沒有出現過。
- 將兩個句子中同時知足上述兩個要求的單詞輸出到列表中。
2.我本身的解題思路spa
- 將兩個字符串轉換成List而且按照默認的排序規則排序,例如,將"uuz rk uuz"排序成"rk uuz uuz",這是爲了在後面將在同一個句子中出現兩次即以上的單詞排除。
- 使用一箇中間字符串tmp當作指針來按照List裏面的順序依次指向每一個元素,因爲有了前面的已經排好順序的代碼,因此這裏採用的方法是,若是List中有某個單詞出現了兩次或兩次以上,例如"rk uuz uuz",先將uuz加入到list中,而後比較第一個uuz和第二個uuz相同,將以前加入list的uuz移除。(因爲對HashMap不太熟悉,使用這種方法也能夠經過,可是會比較麻煩,複雜度也較高。)
- 在知足上面的判斷條件後,判斷某個單詞是否在另一個句子中出現過,若是沒有出現過,就加入到結果集list中。
public String[] uncommonFromSentences(String A, String B) { List<String> list = new LinkedList<>(); String[] aStr = A.split(" "); String[] bStr = B.split(" "); List<String> aList = Arrays.asList(aStr); List<String> bList = Arrays.asList(bStr); Collections.sort(aList); Collections.sort(bList); String tmp1 = ""; for (Iterator<String> iterator = aList.iterator(); iterator.hasNext();) { String string = (String) iterator.next(); if (!tmp1.equals(string)) { if (!bList.contains(string)) { list.add(string); tmp1 = string; } } else { list.remove(tmp1); } } String tmp2 = ""; for (Iterator<String> iterator = bList.iterator(); iterator.hasNext();) { String string = (String) iterator.next(); if (!tmp2.equals(string)) { if (!aList.contains(string)) { list.add(string); tmp2 = string; } } else { list.remove(tmp2); } } String[] result = new String[list.size()]; list.toArray(result); return result; }
3.應該要用的解題思路:HashMap指針
使用HashMap集合將A和B兩個句子中的全部單詞做爲鍵key,將每一個單詞對應的出現次數做爲值value。code
count.getOrDefault(word, 0)的意思是,若是集合中已經存在word這個鍵,就使用其對應的value值,不然,使用默認的值0,用來判斷單詞出現的次數。blog
而後統計HashMap集合中每一個單詞對應的值value,若是等於1就說明只出現了一次,而後加入到結果集ans中便可。排序
時間複雜度:O(M+N),M是A的複雜度,N是B的複雜度。rem
空間複雜度:O(M+N),使用的HashMap集合count所佔用的空間。字符串
class Solution { public String[] uncommonFromSentences(String A, String B) { Map<String, Integer> count = new HashMap(); for (String word: A.split(" ")) count.put(word, count.getOrDefault(word, 0) + 1); for (String word: B.split(" ")) count.put(word, count.getOrDefault(word, 0) + 1); List<String> ans = new LinkedList(); for (String word: count.keySet()) if (count.get(word) == 1) ans.add(word); return ans.toArray(new String[ans.size()]); } }