算法學(xué)習(xí)筆記之初級(jí)字符串(6.3 兩題)

LeetCode刷題總結(jié)

1. 有效的字母異位詞

給定兩個(gè)字符串 s 和 t ,編寫(xiě)一個(gè)函數(shù)來(lái)判斷 t 是否是 s 的一個(gè)字母異位詞嗜傅。

示例 1

輸入: s = "anagram", t = "nagaram"
輸出: true

示例 2

輸入: s = "anagram", t = "nagaram"
輸出: true

說(shuō)明

你可以假設(shè)字符串只包含小寫(xiě)字母。

進(jìn)階

如果輸入字符串包含 unicode 字符怎么辦憔儿?你能否調(diào)整你的解法來(lái)應(yīng)對(duì)這種情況医清?

我的思路與解答(6ms):

class Solution {
    public boolean isAnagram(String s, String t) {
        // 先判斷字符串長(zhǎng)度是否相等,如果不相等則直接返回false
        if(s.length() != t.length()){
            return false;
        }

        // 將字符串轉(zhuǎn)為char類(lèi)型數(shù)組铺罢,并排序
        char[] sc = s.toCharArray();
        char[] tc = t.toCharArray();
        Arrays.sort(sc);
        Arrays.sort(tc);

        // 排序后從第一個(gè)char開(kāi)始對(duì)比艇挨,若有不同則直接返回false
        for(int i = 0; i < sc.length; i++){
            if(sc[i] != tc[i]){
                return false;
            }
        }

    // 默認(rèn)返回true
        return true;
    }
}

別人的解答(4ms):

class Solution {
    public boolean isAnagram(String s, String t) {
    // 定義一個(gè)int類(lèi)型數(shù)組,長(zhǎng)度為26即26個(gè)字母韭赘,用于記錄 s中出現(xiàn)的次數(shù) - t中出現(xiàn)的次數(shù)
        int []chars = new int[26];

    // 先記錄s中每個(gè)字母出現(xiàn)次數(shù)
        for(char c : s.toCharArray()){
            chars[c-'a']++;
        }
    // 再將t中每個(gè)字母出現(xiàn)的次數(shù)扣除
        for(char c: t.toCharArray()){
            chars[c-'a']--;
        }
    // 如果這個(gè)字母的記錄值為0缩滨,則s和t中出現(xiàn)的次數(shù)一樣,反之次數(shù)不一樣,也就是兩個(gè)字符串不是有效的字母異位詞
        for(int i : chars){
            if( i != 0){
                return false;
            }
        }
        return true;
    }
}

小結(jié):

我的辦法是利用了Arrays.sort()方法脉漏,思路比較簡(jiǎn)單苞冯,相同的字符串排序后肯定所有字符的順序一定是一樣的,所以只需排序后對(duì)比各個(gè)字符侧巨,性能較差舅锄。

而別人的解答,思路較為不同刃泡,是統(tǒng)計(jì)各個(gè)字符出現(xiàn)的次數(shù)巧娱,進(jìn)行對(duì)比,沒(méi)有用到Arrays.sort()方法烘贴,性能較好一些。

2. 驗(yàn)證回文字符串

給定一個(gè)字符串撮胧,驗(yàn)證它是否是回文串桨踪,只考慮字母和數(shù)字字符,可以忽略字母的大小寫(xiě)芹啥。

說(shuō)明

本題中锻离,我們將空字符串定義為有效的回文串。

示例 1

輸入: "A man, a plan, a canal: Panama"
輸出: true

示例 2

輸入: "race a car"
輸出: false

我的思路與解答(218 ms):

class Solution {
    public boolean isPalindrome(String s) {
        StringBuffer sb = new StringBuffer(s);

    // 利用StringBuffer將不是字母或者數(shù)字的字符刪除墓怀,并將大寫(xiě)字母轉(zhuǎn)換為小寫(xiě)字母
        for(int i = 0; i < sb.length(); i++){
            if(sb.charAt(i) >= '0' && sb.charAt(i) <= '9'){
                continue;
            }
            if(sb.charAt(i) >= 'A' && sb.charAt(i) <= 'Z'){
                // 小寫(xiě)字母unicode碼比大寫(xiě)的大32
                sb.setCharAt(i, (char)(sb.charAt(i) + 32));
                continue;
            }
            if(sb.charAt(i) < 'a' || sb.charAt(i) > 'z'){
                sb.delete(i, i+1);
                i--;
            }
        }

        char[] sc = sb.toString().toCharArray();

    // 從第一個(gè)與最后一個(gè)進(jìn)行循環(huán)對(duì)比
        for(int i = 0; i < sc.length/2; i++){
            if(sc[i] != sc[sc.length - i -1]){
                return false;
            }
        }
        return true;
    }
}

別人的解答(3ms):

class Solution {
    public boolean isPalindrome(String s) {
    // 若字符串為空或者內(nèi)容為空則直接返回true
        if(s == null || s.length() == 0) return true;
    // 聲明兩個(gè)int類(lèi)型的變量用來(lái)標(biāo)記第一個(gè)字母和最后一個(gè)字母
        int start = 0;
        int end = s.length() - 1;
    // 判斷字母是否是數(shù)字或者字母汽纠,如果不是則指向下一個(gè)字符,并將大寫(xiě)字母轉(zhuǎn)換為小寫(xiě)字母
        while(start < end) {
            char c = ' ';
            while(start < end) {
                c = s.charAt(start);
                if(c >= 'a' && c <= 'z') {
                    break;
                } else if(c >= '0' && c <= '9') {
                    break;
                } else if(c >= 'A' && c <= 'Z') {
                    c = (char) (c - 'A' + 'a');
                    break;
                } else {
                    start++;
                }
            }
            
            char b = ' ';
            while(start < end) {
                b = s.charAt(end);
                if(b >= 'a' && b <= 'z') {
                    break;
                } else if(b >= '0' && b <= '9') {
                    break;
                } else if(b >= 'A' && b <= 'Z') {
                    b = (char) (b - 'A' + 'a');
                    break;
                } else {
                    end--;
                }
            }
        // 進(jìn)行對(duì)比
            if(start < end) {
                if(c != b) {
                    return false;
                }
                start++;
                end--;
            }
        }
        return true;
    }
}

小結(jié):

我的辦法是利用了StringBuffer傀履,將不是數(shù)字與字母的刪除虱朵,并將大寫(xiě)字母轉(zhuǎn)換為小寫(xiě)字母,再進(jìn)行對(duì)比钓账。

而別人的解答碴犬,用了兩個(gè)變量來(lái)標(biāo)記要對(duì)比的兩個(gè)字母的位置,所以少了刪除的操作梆暮,并且沒(méi)有用到StringBuffer服协,性能比我的解答大大提高。

3. 總結(jié)

從這兩題來(lái)看啦粹,我的算法知識(shí)還比較差偿荷,特別是第二題,花費(fèi)了較多的性能去做了沒(méi)必要的操作唠椭,要學(xué)會(huì)靈活使用變量來(lái)標(biāo)記位置跳纳,不過(guò)整體思路還算清晰,需要繼續(xù)努力泪蔫。

4. 最后

歡迎來(lái)看我的博客 RoNnx的博客

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末棒旗,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌铣揉,老刑警劉巖饶深,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異逛拱,居然都是意外死亡敌厘,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)朽合,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)俱两,“玉大人,你說(shuō)我怎么就攤上這事曹步∠懿剩” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵讲婚,是天一觀的道長(zhǎng)尿孔。 經(jīng)常有香客問(wèn)我,道長(zhǎng)筹麸,這世上最難降的妖魔是什么活合? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮物赶,結(jié)果婚禮上白指,老公的妹妹穿的比我還像新娘。我一直安慰自己酵紫,他們只是感情好告嘲,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著憨闰,像睡著了一般状蜗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鹉动,一...
    開(kāi)封第一講書(shū)人閱讀 49,842評(píng)論 1 290
  • 那天轧坎,我揣著相機(jī)與錄音,去河邊找鬼泽示。 笑死缸血,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的械筛。 我是一名探鬼主播捎泻,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼埋哟!你這毒婦竟也來(lái)了笆豁?” 一聲冷哼從身側(cè)響起郎汪,我...
    開(kāi)封第一講書(shū)人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎闯狱,沒(méi)想到半個(gè)月后煞赢,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡哄孤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年照筑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瘦陈。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡凝危,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出晨逝,到底是詐尸還是另有隱情蛾默,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布捉貌,位于F島的核電站趴生,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏昏翰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一刘急、第九天 我趴在偏房一處隱蔽的房頂上張望棚菊。 院中可真熱鬧,春花似錦叔汁、人聲如沸统求。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)码邻。三九已至,卻和暖如春另假,著一層夾襖步出監(jiān)牢的瞬間像屋,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工边篮, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留己莺,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓戈轿,卻偏偏與公主長(zhǎng)得像凌受,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子思杯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

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

  • 前言 最先接觸編程的知識(shí)是在大學(xué)里面,大學(xué)里面學(xué)了一些基礎(chǔ)的知識(shí)誊册,c語(yǔ)言领突,java語(yǔ)言,單片機(jī)的匯編語(yǔ)言等解虱;大學(xué)畢...
    oceanfive閱讀 3,049評(píng)論 0 7
  • 第5章 引用類(lèi)型(返回首頁(yè)) 本章內(nèi)容 使用對(duì)象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類(lèi)型 使用基本類(lèi)型...
    大學(xué)一百閱讀 3,219評(píng)論 0 4
  • 昨天看了唐國(guó)強(qiáng)版的《三國(guó)演義》秧饮,正好是街亭失守,諸葛亮揮淚斬馬謖那一集吁峻。跟10多年前看這個(gè)劇情不同悍汛,這次第一個(gè)念頭...
    大叔有文化閱讀 1,409評(píng)論 0 4
  • 這個(gè)世界賺錢(qián)真的很容易捞魁,你不一定非要去想破腦袋搞一個(gè)什么創(chuàng)新,只要在當(dāng)下的各行各業(yè)里隨便干一行都能賺很多錢(qián)离咐,比如開(kāi)...
    isgiker閱讀 443評(píng)論 0 0
  • url映射### 先構(gòu)造一個(gè)url和類(lèi)的映射元組 在下面構(gòu)造對(duì)應(yīng)的類(lèi),如 框架內(nèi)部會(huì)把映射元組轉(zhuǎn)換為包含多個(gè)由ur...
    林聰色閱讀 295評(píng)論 0 0