字符串問題

1.[Minimum Window Substring]https://leetcode.com/problems/minimum-window-substring/description/
solution:同樣是利用HashMap來存Dict,key保存word冰寻,value保存word出現(xiàn)的次數(shù)(要查找的串)辐董。然后來遍歷整個母串胀糜。因?yàn)檫@里是要求最短的包含子串的字符串悬嗓,所以中間是可以允許有非子串字符的,當(dāng)遇見非子串字符而count又沒到子串長度時堰乔,可以繼續(xù)走仓犬。當(dāng)count達(dá)到子串長度,說明之前遍歷的這些有符合條件的串超棺,用一個pre指針幫忙找向族,pre指針幫忙找第一個在HashMap中存過的,并且找到后給計數(shù)加1后的總計數(shù)是大于0的棠绘,判斷是否為全局最小長度炸枣,如果是,更新返回字符串res弄唧,更新最小長度适肠,如果不是,繼續(xù)找候引。

class Solution {
    public String minWindow(String S, String T) {
        if(S == null || S.length() == 0)  
        return "";  
    HashMap<Character, Integer> map = new HashMap<Character, Integer>();  
    for(int i=0; i<T.length();i++)  
    {  
        if(map.containsKey(T.charAt(i)))  
        {  
            map.put(T.charAt(i),map.get(T.charAt(i))+1);  
        }  
        else  
        {  
            map.put(T.charAt(i),1);  
        }  
    }  
    int left = 0;  
    int count = 0;  
    int minLen = S.length()+1;  
    int minStart = 0;  
    for(int right=0; right<S.length();right++)  
    {  
        if(map.containsKey(S.charAt(right)))  
        {  
            map.put(S.charAt(right),map.get(S.charAt(right))-1);  
            if(map.get(S.charAt(right))>=0)  
            {  
                count++;  
            }  
            while(count == T.length())  
            {  
                if(right-left+1<minLen)  
                {  
                    minLen = right-left+1;  
                    minStart = left;                      
                }  
                if(map.containsKey(S.charAt(left)))  
                {  
                    map.put(S.charAt(left), map.get(S.charAt(left))+1);  
                    if(map.get(S.charAt(left))>0)  
                    {  
                        count--;  
                    }  
                }  
                left++;  
            }  
        }  
    }  
    if(minLen>S.length())  
    {  
        return "";  
    }  
    return S.substring(minStart,minStart+minLen); 
    }
}

solution 2:雙指針

2.第一個只出現(xiàn)一次的字符
solution:需要一個數(shù)據(jù)容器來存放每個字符的出現(xiàn)次數(shù)侯养。在這個數(shù)據(jù)容器中可以根據(jù)字符來查找它出現(xiàn)的次數(shù),也就是說這個容器的作用是把每一個字符映射成一個數(shù)字澄干」淇可以采用哈希表。第一次掃描時麸俘,在哈希表中出現(xiàn)更新一個字符出現(xiàn)的次數(shù)是O(n)辩稽,如果字符串長度是n,那么第一次掃描的時間復(fù)雜度是O(n)从媚。第二次掃描時逞泄,同樣O(1)能讀出一個字符出現(xiàn)的次數(shù)。

public Character firstNotRepeating(String str){  
        if(str == null)  
            return null;  
        char[] strChar = str.toCharArray();  
        LinkedHashMap<Character,Integer> hash = new LinkedHashMap<Character,Integer>();  
        for(char item:strChar){  
            if(hash.containsKey(item))  
                hash.put(item, hash.get(item)+1);  
            else  
                hash.put(item, 1);  
        }  
        for(char key:hash.keySet())  
        {  
            if(hash.get(key)== 1)  
                return key;  
        }  
        return null;  
    }  

LeetCode版解法
[First Unique Character in a String]https://leetcode.com/problems/first-unique-character-in-a-string/description/

public int firstUniqChar(String s) {
        Map<Character, Integer> map = new LinkedHashMap<>();
        Set<Character> set = new HashSet<>();
        for (int i = 0; i < s.length(); i++) {
            if (set.contains(s.charAt(i))) {
                if (map.get(s.charAt(i)) != null) {
                    map.remove(s.charAt(i));
                }
            } else {
                map.put(s.charAt(i), i);
                set.add(s.charAt(i));
            }
        }
        return map.size() == 0 ? -1 : map.entrySet().iterator().next().getValue();
    }

3.字符串的排列
solution:求整個字符串的排列拜效,可以看成兩步喷众,首先求所有可能出現(xiàn)在第一個位置的字符,即把第一個字符和后面所有的字符交換紧憾。第二步固定第一個字符到千,求后面所有字符的排列。這個時候仍然把后面的字符分成兩部分:后面字符的第一個字符赴穗,以及這個字符之后的所有字符憔四。然后把第一個字符逐一和它后面的字符交換膀息。

class Solution {
    public List<List<Integer>> permute(int[] nums) {
        
        List<List<Integer>> result = new ArrayList<Integer>();
        int len = nums.length;
        if (len == 0||nums == null)  return res;
        // 采用前后元素交換的辦法,dfs解題
        exchange(nums, 0, len);
        return result;
    }
    
    public void exchange(int[] nums, int i, int len) {
        // 將當(dāng)前數(shù)組加到結(jié)果集中
        if(i == len-1) {
            List<Integer> list = new ArrayList<>();
            for (int j=0; j<len; j++){
                list.add(nums[j]);
            }
            res.add(list);
            return ;
        }
        // 將當(dāng)前位置的數(shù)跟后面的數(shù)交換了赵,并搜索解
        for (int j=i; j<len; j++) {
            swap(nums, i, j);
            exchange(nums, i+1, len);
            swap(nums, i, j);
        }
    }
    
    public void swap(int[] nums, int i, int j) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
}
# 遞歸方式
class Solution {
    public List<List<Integer>> permute(int[] nums) {
    List<List<Integer>> list = new ArrayList<>();
    // Arrays.sort(nums); // not necessary
    backtrack(list, new ArrayList<>(), nums);
    return list;
    }

    private void backtrack(List<List<Integer>> list, List<Integer> tempList, int [] nums){
    
        if(tempList.size() == nums.length){
        
            list.add(new ArrayList<>(tempList));
        } else {
            for(int i = 0; i < nums.length; i++){ 
                if(tempList.contains(nums[i])) continue; // element already exists, skip
                tempList.add(nums[i]);
                backtrack(list, tempList, nums);
                tempList.remove(tempList.size() - 1);
            }
        }   
    } 
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末潜支,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子斟览,更是在濱河造成了極大的恐慌毁腿,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件苛茂,死亡現(xiàn)場離奇詭異已烤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)妓羊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門胯究,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人躁绸,你說我怎么就攤上這事裕循。” “怎么了净刮?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵剥哑,是天一觀的道長。 經(jīng)常有香客問我淹父,道長株婴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任暑认,我火速辦了婚禮困介,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蘸际。我一直安慰自己座哩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布粮彤。 她就那樣靜靜地躺著根穷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪驾诈。 梳的紋絲不亂的頭發(fā)上缠诅,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天,我揣著相機(jī)與錄音乍迄,去河邊找鬼。 笑死士败,一個胖子當(dāng)著我的面吹牛闯两,可吹牛的內(nèi)容都是我干的褥伴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼漾狼,長吁一口氣:“原來是場噩夢啊……” “哼重慢!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起逊躁,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤似踱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后稽煤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體核芽,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年酵熙,在試婚紗的時候發(fā)現(xiàn)自己被綠了轧简。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡匾二,死狀恐怖哮独,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情察藐,我是刑警寧澤皮璧,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站分飞,受9級特大地震影響悴务,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜浸须,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一惨寿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧删窒,春花似錦裂垦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至诚亚,卻和暖如春晕换,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背站宗。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工闸准, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人梢灭。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓夷家,卻偏偏與公主長得像蒸其,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子库快,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容