leetcode面試top(11字符串)

string.capitalize() 第一個(gè)字符大寫
string.count(str, beg=0, end=len(string)) 返回 str 在 string 里面出現(xiàn)的次數(shù),beg 、 end 指定范圍
string.endswith(obj, beg=0, end=len(string)) 檢查字符串是否以 obj 結(jié)束
string.find(str, beg=0, end=len(string)) 返回str開始的索引值,否則返回-1
string.index(str, beg=0, end=len(string)) 跟find()方法一樣夕土,只不過如果str不在 string中會(huì)報(bào)一個(gè)異常.
string.isalnum() string 至少有一個(gè)字符并且所有字符都是字母或數(shù)字則返回 True
string.isalpha()  string 至少有一個(gè)字符并且所有字符都是字母則返回 True
string.isdecimal()  string 只包含十進(jìn)制數(shù)字則返回 True 
string.isdigit()  string 只包含數(shù)字則返回 True
string.islower() string 都是小寫呐馆,則返回 True
string.isnumeric()  string 中只包含數(shù)字字符臼隔,則返回 Tru
string.isspace()  string 中只包含空格遂唧,則返回 True
string.istitle()  string 是標(biāo)題化的(見 title())則返回 True
string.isupper() string 都是大寫如输,則返回 True
string.join(seq) 以 string 作為分隔符有鹿,將 seq 中所有的元素(的字符串表示)合并為一個(gè)新的字符串
string.lower() 轉(zhuǎn)換 string 中所有大寫字符為小寫.
string.lstrip() 截掉 string 左邊的空格
max(str) 返回字符串 str 中最大的字母旭旭。
min(str) 返回字符串 str 中最小的字母。
string.replace(str1, str2, num=string.count(str1)) 把 string 中的 str1 替換成 str2,替換不超過 num 次.
string.split(str="", num=string.count(str)) 以 str 為分隔符切片 string葱跋,僅分隔 num+ 個(gè)子字符串
string.startswith(obj, beg=0,end=len(string)) 檢查字符串是否是以 obj 開頭持寄,是則返回 True
string.strip([obj]) 在 string 上執(zhí)行 lstrip()和 rstrip()
string.swapcase() 翻轉(zhuǎn) string 中的大小寫
string.title() 返回"標(biāo)題化"的 string,就是說所有單詞都是以大寫開始,其余字母均為小寫(見 istitle())
string.translate(str, del="") 根據(jù) str 給出的表(包含 256 個(gè)字符)轉(zhuǎn)換 string 的字符,要過濾掉的字符放到 del 參數(shù)中
string.upper() 轉(zhuǎn)換 string 中的小寫字母為大寫

字符串

給定一個(gè)字符串娱俺,驗(yàn)證它是否是回文串稍味,只考慮字母和數(shù)字字符,可以忽略字母的大小寫荠卷。
說明:本題中模庐,我們將空字符串定義為有效的回文串。
輸入: "A man, a plan, a canal: Panama"
輸出: true

逆字符串

class Solution:
    def isPalindrome(self, s: str) -> bool:
        alnum = ''.join(w.lower() for w in s if w.isalnum())
        return alnum == alnum[::-1]

使用雙指針油宜。初始時(shí)掂碱,左右指針分別指向兩側(cè)怜姿,隨后我們不斷地將這兩個(gè)指針相向移動(dòng),每次移動(dòng)一步疼燥,并判斷這兩個(gè)指針指向的字符是否相同沧卢。當(dāng)這兩個(gè)指針相遇時(shí),就說明是回文串醉者。

class Solution:
    def isPalindrome(self, s: str) -> bool:
        pre = 0
        nex = len(s) - 1
        while pre < nex:
            # 找到下一個(gè)字母或數(shù)字
            while pre < nex and not s[pre].isalnum():  # 忽略非字母數(shù)字
                pre += 1
            while pre < nex and  not s[nex].isalnum():  # 忽略非字母或數(shù)字
                nex -= 1
            # 判斷
            if pre < nex:
                if s[pre].lower() != s[nex].lower():  # 忽略大小寫
                    return False
                pre += 1
                nex -= 1
        return True

給定一個(gè)字符串 s但狭,將 s 分割成一些子串,使每個(gè)子串都是回文串湃交。
返回 s 所有可能的分割方案熟空。
示例:
輸入: "aab"
輸出:
[ ["aa","b"], ["a","a","b"] ]

實(shí)現(xiàn)一個(gè) Trie (前綴樹)藤巢,包含 insert, search, 和 startsWith 這三個(gè)操作搞莺。

Trie 是一顆非典型的多叉樹模型
一般的多叉樹的結(jié)點(diǎn)是這樣的:

struct TreeNode {
    VALUETYPE value;    //結(jié)點(diǎn)值
    TreeNode* children[NUM];    //指向孩子結(jié)點(diǎn)
};

而 Trie 的結(jié)點(diǎn)是這樣的(假設(shè)只包含'a'~'z'中的字符):

struct TrieNode {
    bool isEnd; //該結(jié)點(diǎn)是否是一個(gè)串的結(jié)束
    TrieNode* next[26]; //字母映射表
};

這時(shí)字母映射表next 的妙用就體現(xiàn)了,TrieNode* next[26]中保存了對(duì)當(dāng)前結(jié)點(diǎn)而言下一個(gè)可能出現(xiàn)的所有字符的鏈接掂咒,因此我們可以通過一個(gè)父結(jié)點(diǎn)來預(yù)知它所有子結(jié)點(diǎn)的值:

示例:
Trie trie = new Trie();
trie.insert("apple");
trie.search("apple"); // 返回 true
trie.search("app"); // 返回 false
trie.startsWith("app"); // 返回 true
trie.insert("app");
trie.search("app"); // 返回 true

說明:
你可以假設(shè)所有的輸入都是由小寫字母 a-z 構(gòu)成的才沧。
保證所有輸入均為非空字符串。

給定一個(gè)二維網(wǎng)格 board 和一個(gè)字典中的單詞列表 words绍刮,找出所有同時(shí)在二維網(wǎng)格和字典中出現(xiàn)的單詞温圆。
單詞必須按照字母順序,通過相鄰的單元格內(nèi)的字母構(gòu)成孩革,其中“相鄰”單元格是那些水平相鄰或垂直相鄰的單元格岁歉。同一個(gè)單元格內(nèi)的字母在一個(gè)單詞中不允許被重復(fù)使用。

輸入:
words = ["oath","pea","eat","rain"]
board =
[ ['o','a','a','n'],
['e', 't', 'a', 'e'],
['i', 'h', 'k', 'r'],
['i', 'f', 'l', 'v'] ]
輸出: ["eat","oath"]


給定兩個(gè)字符串 s 和 t 膝蜈,編寫一個(gè)函數(shù)來判斷 t 是否是 s 的字母異位詞锅移。
輸入: s = "anagram", t = "nagaram"
輸出: true

逐個(gè)去除b里的a中字符

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        if len(s) != len(t):
            return False
        s = list(s)
        t = list(t)
        for i in s:
            try:
                t.remove(i)
            except ValueError as e:
                return False
        return True

第一次循環(huán)哈希表記錄,第二次循環(huán)刪去哈希表記錄饱搏,最后統(tǒng)計(jì)哈希表每個(gè)值是否都為0

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        if len(s) != len(t):
            return False
        word_count = {}
        # 建立哈希表
        for i in s:
            if i not in word_count:
                word_count[i] = 1
            else:
                word_count[i] += 1
        # 清空哈希表
        for i in t:
            if i in word_count:
                word_count[i] -= 1
            else:
                return False
        # all([]) ture any([]) false
        return not any(list(word_count.values()))  

給定一個(gè)字符串非剃,找到它的第一個(gè)不重復(fù)的字符,并返回它的索引推沸。如果不存在备绽,則返回 -1。

哈希表記錄每個(gè)字符出現(xiàn)次數(shù)

class Solution:
    def firstUniqChar(self, s: str) -> int:
        #  count = collections.Counter(s)
        word_count = {}
        # 建立哈希表
        for i in s:
            if i not in word_count:
                word_count[i] = 1
            else:
                word_count[i] +=1
         # 根據(jù)哈希表判斷出現(xiàn)次數(shù)
        for index, word in enumerate(s):
            if word_count[word]  == 1:
                return index
        return -1

編寫一個(gè)函數(shù)鬓催,其作用是將輸入的字符串反轉(zhuǎn)過來肺素。輸入字符串以字符數(shù)組 char[] 的形式給出。

# s[:]=s[::-1]
# 雙指針
 l,r=0,len(s)-1
        while l<r:
            s[l],s[r]=s[r],s[l]
            l+=1
            r-=1

3.無重復(fù)字符的最長子串長度

示例 1:
輸入: s = "abcabcbb"
輸出: 3
解釋: 因?yàn)闊o重復(fù)字符的最長子串是 "abc"宇驾,所以其長度為 3压怠。

使用數(shù)組作為滑動(dòng)窗口

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        if not s: return 0
        substr = []
        max_len = 0
        for word in s:
            if word not in substr:
                # 擴(kuò)展窗口
                substr.append(word)
            else:
                # 從窗口中移除重復(fù)字符及之前的字符串部分
                substr = substr[substr.index(word)+1:]
                # 擴(kuò)展窗口
                substr.append(word)
            max_len = max(max_len, len(substr))
        return max_len

法1中容器的伸縮涉及內(nèi)存分配,所以方法2換成位置指針省掉了內(nèi)存分配

直觀的滑動(dòng)窗口方法需要維護(hù)數(shù)組的增刪,實(shí)際上比較耗時(shí)飞苇。使用雙指針(索引)菌瘫,記錄滑動(dòng)窗口起始和結(jié)束的索引值蜗顽,可以減除數(shù)組增刪操作,提高效率雨让,使用指針位移以及從原數(shù)組中截取雇盖,代替原來的窗口元素增刪操作

def lengthOfLongestSubstring(self, s: str) -> int:
        # 字符串為空則返回零
        if not s: return 0
        max_len = 0   
        left_index, right_index = 0, 0  # 雙指針
        for word in s:
            # 如果字符不在滑動(dòng)窗口中,則直接擴(kuò)展窗口
            if word not in s[left_index:right_index]:
                # 右指針右移一位
                right_index += 1
            else:
                # 左指針右移 word在substr中的索引 位
                left_index += s[left_index:right_index].index(word) + 1
                # 右指針右移一位
                right_index += 1
            max_len = max(right_index - left_index, max_len)
        return max_len 

Hash(字典)栖忠,滑動(dòng)窗口崔挖,雙指針
使用字典記錄任意字符最近的索引值,字典查詢時(shí)間復(fù)雜度為O(1)庵寞,相比數(shù)組查詢狸相,效率更高
該算法的難點(diǎn)在于理解word_index[word] > ignore_end_index如果不大于說明word已經(jīng)被丟棄;大于說明word未被丟棄需要捐川,更新ignore_end_index

    def lengthOfLongestSubstring(self, s: str) -> int:
        ignore_end_index = -1          # 指向子串左邊一個(gè)字符脓鹃,即丟棄的子串的尾部, 初始值為 -1古沥,還沒有開始移動(dòng)
        max_len = 0          # 記錄最大的長度
        word_index = {}          # 滑動(dòng)窗口瘸右,任意字符最后出現(xiàn)位置的索引
        for index, word in enumerate(s): 
             # 如果 word出現(xiàn)過 且  最近一次出現(xiàn)的索引大于ignore_end,意味著需要丟棄這個(gè)詞前面的部分
            # 如果不大于說明word已經(jīng)被丟棄岩齿;大于說明word未被丟棄需要太颤,更新ignore_end_index                   
            if word in word_index and word_index[word] > ignore_end_index:  
                ignore_end_index = word_index[word]  # 新的子串開始
                word_index[word] = index  # 更新word的索引
            else:
                # word未出現(xiàn)過
                word_index[word] = index  # 子串變長
                max_len = max(max_len, index - ignore_end_index)   # 更新最大長度
        return max_len
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市盹沈,隨后出現(xiàn)的幾起案子龄章,更是在濱河造成了極大的恐慌,老刑警劉巖乞封,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件做裙,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡歌亲,警方通過查閱死者的電腦和手機(jī)菇用,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來陷揪,“玉大人惋鸥,你說我怎么就攤上這事『凡” “怎么了卦绣?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長飞蚓。 經(jīng)常有香客問我滤港,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任溅漾,我火速辦了婚禮山叮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘添履。我一直安慰自己屁倔,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布暮胧。 她就那樣靜靜地躺著锐借,像睡著了一般。 火紅的嫁衣襯著肌膚如雪往衷。 梳的紋絲不亂的頭發(fā)上钞翔,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音席舍,去河邊找鬼布轿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛俺亮,可吹牛的內(nèi)容都是我干的驮捍。 我是一名探鬼主播疟呐,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼脚曾,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了启具?” 一聲冷哼從身側(cè)響起本讥,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鲁冯,沒想到半個(gè)月后拷沸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡薯演,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年撞芍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片跨扮。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡序无,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出衡创,到底是詐尸還是另有隱情帝嗡,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布璃氢,位于F島的核電站哟玷,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏一也。R本人自食惡果不足惜巢寡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一喉脖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧抑月,春花似錦动看、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至挨稿,卻和暖如春仇轻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背奶甘。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國打工篷店, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人臭家。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓疲陕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親钉赁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蹄殃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

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