Leetcode String 刷題筆記

String

1月16日

28 💗 strStr() 💗 EASY

運用了string的substring方法和equals方法 str.substring(start包括,end不包括).equals(des);java

14 💗 最長公共前綴 💗 EASY

把第一個做爲模版res,若是index(res)!=0則證實當前模版不是前綴,index(res)爲-1表明不存在,用substring()方法把模版減小一位git

58 💗 最後一個單詞長度 💗 EASY ♍️

🌟測試用例說若是string的末尾不是字母就一直跳過到字母,用Character.isLetter()數組

387 💗 字符串中的第一個惟一字符 💗 EASY ♍️

先創建一個新的array把全部的char-'a'存入array中,再次for循環若是遇到了值爲1的則是第一個惟一字符app

383 💗 贖金信 💗 EASY ♍️

  • 1.和387思路徹底一致
  • 2.用.split("")把string變成array而後sort排序後再逐個比較

344 💗 反轉字符串 💗 EASY

先變成array再用雙指針調換位置測試

  • 1.toCharArray()能夠直接將string變成array
  • 2.new String(arr) 能夠直接將array變成string

151 💗 反轉字符串裏的單詞 💗 MID

    1. 用trim()去除頭尾的空格->用.split("\s+")去除中間的全部空格回車存進Array->用stringBuilder把單詞逐個append(),StringBuilder比StringBuffer快,且不用新佔內存,String每次要佔用新內存 O(n) O(n)
    1. 先trim()->toStringArray()把整個字符串倒過來->依次倒轉每一個單詞 O(n) O(1)

345 💗 反轉字符串中的元音字母 💗 EASY

雙指針從兩邊向中間查找元音字母而後交換,須要注意的一點是str.contains()裏的東西若是是char須要用char+""變成string O(n) O(1)ui

205 💗 同構字符串 💗 EASY

  • 1.用HashMap->若是map.containsKey(a)並且map.get(a).equals(b)賊正確->若是沒有a的話就.containsValue(b),若是也沒有b就用map.put(a,b)
    1. 用array創建一個map,ASCII一共256位,創建一個512位的數組,從較低的256投射到較高的256位都設爲i,若是再次出現則檢查是否符合原投影

125 💗 驗證迴文串 💗 EASY ♍️

雙指針,和345思路徹底相同,注意大小寫str.toLowerCase(),注意是否是數字Character.isDigit()不能斷定負數spa

1月17日

392 💗 判斷子序列 💗 MID ♍️

雙指針指針

290 💗 單詞模式 💗 EASY ♍️

HashMap把字母和單詞看成鍵值對存入,主要斷定條件,能夠更簡便的方式來聲明map:code

Map map = new HashMap();
複製代碼

49 💗 字母異位分組 💗 MID

新建List<List>和HashMap<String,Integer>->用toCharArray,sort,new String把單詞排序而後判斷map裏是否存在,若是存在就往list裏的現存sublist加,若是不存在則新建sublist排序

1月21

242 💗 有效的字母異位 💗 EASY

先判斷長度是否相同,而後用字母表array存下來一個string加加,再用第二個string減減

20 💗 有效括號 💗 EASY

創建一個stack來存取右邊的括號,stack: push(), pop(), empty(), peek()

76 💗 最小覆蓋字串 💗 HARD

🌞🌞🌞Sliding Window.

class Solution {
    public String minWindow(String s, String t) {
        if(t.length()>s.length()||s==null) return ""; 
        int[] cnt = new int[128];
        for(char c : t.toCharArray()){
            cnt[c]++;
        }
        int from = 0;
        int min = Integer.MAX_VALUE;
        int total = t.length();
        for(int i=0, j=0; i<s.length(); i++){
            if(cnt[s.charAt(i)]-->0) total--;
            while(total==0){
                if(i-j+1<min){
                    min = i-j+1;
                    from = j;
                }
                if(++cnt[s.charAt(j++)]>0) total++;
            }
        }
        return (min==Integer.MAX_VALUE)? "":s.substring(from,from+min);
    }
}
複製代碼

1月23日

30 💗 串聯全部單詞的子串 💗 HARD

存到hashmap裏,for循環(s-t).length,查看是否都符合hashmap裏的詞彙。

class Solution {
    public List<Integer> findSubstring(String s, String[] words) {
        List<Integer> list = new ArrayList<>();
        if(s==null || words==null || s.length()==0 ||words.length==0) return list;        
        HashMap<String, Integer> map = new HashMap<>();
        for(int i=0; i<words.length; i++){
            if(map.containsKey(words[i])){
                map.put(words[i], map.get(words[i])+1);
            }else{
                map.put(words[i], 1);
            }
        }
        for(int i=0; i<=s.length()-words.length*words[0].length();i++){
            HashMap<String, Integer> copy = new HashMap<>(map);
            int j = i;
            int count = words.length;
            while(count>0){
                String str = s.substring(j, j+words[0].length());
                if(!copy.containsKey(str)||copy.get(str)<=0){
                    break;
                }else{
                    copy.put(str, copy.get(str)-1);
                    j += words[0].length();
                    count--;
                }
            }
            if(count==0) list.add(i);
        }
        return list;
    }
}
複製代碼
相關文章
相關標籤/搜索