0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

判斷兩個字符串中的字母是否一致

算法與數(shù)據(jù)結構 ? 來源:吳師兄學算法 ? 作者:吳師兄學算法 ? 2022-08-05 11:49 ? 次閱讀

大家好,我是吳師兄

今天的題目來源于 LeetCode 第 242 號問題:有效的字母異位詞,難度為「簡單」。

一、題目描述

給定兩個字符串st,編寫一個函數(shù)來判斷t是否是s的字母異位詞。

注意:st中每個字符出現(xiàn)的次數(shù)都相同,則稱st互為字母異位詞。

示例 1:

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

示例 2:

輸入:s="rat",t="car"
輸出:false

提示:

  • 1 <= s.length, t.length <= 5 * 104
  • st僅包含小寫字母

進階:如果輸入字符串包含 unicode 字符怎么辦?你能否調(diào)整你的解法來應對這種情況?

二、題目解析

題目講的是讓你判斷兩個字符串中的字母是否一致,比如示例1中,s包含字母a、n、g、r、m,而t中也包含a、n、g、r、m,都是只有這五個字母,并且頻次相同,只是順序不同。

看到頻次這個詞,你腦海中第一想法是什么?

沒錯,就是哈希表

解法思路很簡單。

1、首先先判斷兩個字符串長度是否相同,不相同直接返回false

2、然后把s中所有的字符出現(xiàn)個數(shù)使用計數(shù)器統(tǒng)計起來,存入一個大小為 26 的數(shù)組中(注意題目的說明)

2bfac0ea-1471-11ed-ba43-dac502259ad0.png

3、最后再來統(tǒng)計t字符串,即遍歷t時將對應的字母頻次進行減少,如果期間 計數(shù)器出現(xiàn)小于零的情況,則說明t中包含一個不存在于s中的字母,直接返回false。

2c1f3bbe-1471-11ed-ba43-dac502259ad0.png

4、最后檢查計數(shù)器是否歸零。

三、參考代碼

1、Java 代碼

//登錄AlgoMooc官網(wǎng)獲取更多算法圖解
//https://www.algomooc.com
//作者:程序員吳師兄
//代碼有看不懂的地方一定要私聊咨詢吳師兄呀
//有效的字母異位詞(LeetCode 242):https://leetcode.cn/problems/valid-anagram/
classSolution{
publicbooleanisAnagram(Strings,Stringt){

//如果兩個字符串的長度都不一致,那么肯定是無法成為字母異位詞的
if(s.length()!=t.length()){

//直接返回false
returnfalse;

}

//讓a-z這26個字母對應的下標變成0-25方便存到數(shù)組中
//比如a對應的索引就是0
//b對應的索引就是1
int[]table=newint[26];

//從頭到尾遍歷字符串s
for(inti=0;i//把訪問的字符轉(zhuǎn)換為整數(shù)的形式
//比如訪問字母a,那么-'a'之后就是0,就是a對應的索引為0
intindex=s.charAt(i)-'a';

//那么意味著這個字母出現(xiàn)的頻次需要加1
table[index]++;

}

for(inti=0;i//把訪問的字符轉(zhuǎn)換為整數(shù)的形式
//比如訪問字母a,那么-'a'之后就是0,就是a對應的索引為0
intindex=t.charAt(i)-'a';

//那么意味著這個字母出現(xiàn)的頻次需要減1
table[index]--;

//如果說發(fā)現(xiàn)這個字母出現(xiàn)的頻次小于了0
//說明t中出現(xiàn)了s中不曾用的字母
if(table[index]0){

//那就不是字母異位詞
returnfalse;

}

}

//否則,說明是字母異位詞
returntrue;

}
}

2、C++ 代碼

classSolution{
public:
boolisAnagram(strings,stringt){
//如果兩個字符串的長度都不一致,那么肯定是無法成為字母異位詞的
if(s.length()!=t.length()){

//直接返回false
returnfalse;

}

//讓a-z這26個字母對應的下標變成0-25方便存到數(shù)組中
//比如a對應的索引就是0
//b對應的索引就是1
vector<int>table(26,0);

//從頭到尾遍歷字符串s
for(inti=0;i//把訪問的字符轉(zhuǎn)換為整數(shù)的形式
//比如訪問字母a,那么-'a'之后就是0,就是a對應的索引為0
intindex=s[i]-'a';

//那么意味著這個字母出現(xiàn)的頻次需要加1
table[index]++;

}

for(inti=0;i//把訪問的字符轉(zhuǎn)換為整數(shù)的形式
//比如訪問字母a,那么-'a'之后就是0,就是a對應的索引為0
intindex=t[i]-'a';

//那么意味著這個字母出現(xiàn)的頻次需要減1
table[index]--;

//如果說發(fā)現(xiàn)這個字母出現(xiàn)的頻次小于了0
//說明t中出現(xiàn)了s中不曾用的字母
if(table[index]0){

//那就不是字母異位詞
returnfalse;

}

}

//否則,說明是字母異位詞
returntrue;
}
};

3、Python 代碼

classSolution:
defisAnagram(self,s:str,t:str)->bool:

#如果兩個字符串的長度都不一致,那么肯定是無法成為字母異位詞的
iflen(s)!=len(t):
#直接返回False
returnFalse

#讓a-z這26個字母對應的下標變成0-25方便存到數(shù)組中
#比如a對應的索引就是0
#b對應的索引就是1
table=[0]*26

#從頭到尾遍歷字符串s
foriins:

#把訪問的字符轉(zhuǎn)換為整數(shù)的形式
#比如訪問字母a,那么-'a'之后就是0,就是a對應的索引為0
index=ord(i)-ord('a')

#那么意味著這個字母出現(xiàn)的頻次需要加1
table[index]+=1


foriint:

#把訪問的字符轉(zhuǎn)換為整數(shù)的形式
#比如訪問字母a,那么-'a'之后就是0,就是a對應的索引為0
index=ord(i)-ord('a')

#那么意味著這個字母出現(xiàn)的頻次需要減1
table[index]-=1

#如果說發(fā)現(xiàn)這個字母出現(xiàn)的頻次小于了0
#說明t中出現(xiàn)了s中不曾用的字母
iftable[index]0:

#那就不是字母異位詞
returnFalse


#否則,說明是字母異位詞
returnTrue

四、復雜度分析

  • 時間復雜度:O(n),其中 n 為 s 的長度。
  • 空間復雜度:O(S)),其中 S 為字符集大小,此處 S = 26 。

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 計數(shù)器
    +關注

    關注

    32

    文章

    2253

    瀏覽量

    94287
  • 字母
    +關注

    關注

    0

    文章

    2

    瀏覽量

    7141
  • 字符串
    +關注

    關注

    1

    文章

    575

    瀏覽量

    20470

原文標題:LeetCode 242:有效的字母異位詞

文章出處:【微信號:TheAlgorithm,微信公眾號:算法與數(shù)據(jù)結構】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關推薦

    ASCII碼在編程的應用實例

    的應用實例: 1. 字符串處理 在編程,ASCII碼常用于字符串的處理。例如,可以使用ASCII碼來比較兩個字符的大小關系,或者通過將字符
    的頭像 發(fā)表于 11-10 09:43 ?150次閱讀

    MATLAB(5)--字符串處理

    兩個字符串里的每個字符依次按ASCII值大小逐個進行比較,比較的結果是個數(shù)值向量,向量的元素為1或者0。 字符串比較函數(shù)用于
    發(fā)表于 09-06 10:22

    labview中常用的字符串函數(shù)有哪些?

    ) : 功能:該函數(shù)用于返回字符串所包含的字符個數(shù)。 應用場景:常用于需要計算字符串長度的場景,如文件命名、數(shù)據(jù)處理等。 連接字符串(String Concatenate) : 功能:
    的頭像 發(fā)表于 09-04 15:43 ?429次閱讀

    如何提取串口接收字符串數(shù)組里的某個字符串?

    條(有時候二十多條不定)響應字符串指令,我是用一個字符串數(shù)組來接收這些返回來的指令的。我現(xiàn)在只需要讀取數(shù)組里的某條指令,應該怎么把它提取出來?。??有哪位前輩懂的,希望能提供點幫助。我找了好久找到
    發(fā)表于 04-22 06:05

    labview掃描字符串怎么用

    的函數(shù): 文本掃描器(Text Scan)函數(shù):這個函數(shù)可以從一個字符串中提取出特定的數(shù)據(jù),例如數(shù)字或者其他文本。你可以指定要提取的數(shù)據(jù)的格式,如整數(shù)、浮點數(shù)等。文本掃描器函數(shù)還可以跳過不需要的字符字符串。 分割
    的頭像 發(fā)表于 12-26 16:58 ?1791次閱讀

    oracle字符串split成多個

    Oracle是種廣泛使用的關系型數(shù)據(jù)庫管理系統(tǒng),它提供了許多強大的功能和函數(shù),用于處理和操作數(shù)據(jù)。其中之就是字符串分割(split)方法,該方法用于將一個字符串按照指定的分隔符分割
    的頭像 發(fā)表于 12-06 09:54 ?5035次閱讀

    oracle判斷字符串包含某個字符

    字符串操作是任何編程語言中都非常重要的部分,Oracle數(shù)據(jù)庫作為目前最常用的關系型數(shù)據(jù)庫之,也提供了豐富的字符串操作函數(shù)和方法。在本文中,我們將詳細解析如何在Oracle
    的頭像 發(fā)表于 12-06 09:53 ?1.4w次閱讀

    oracle拼接字符串函數(shù)wm_con

    在Oracle數(shù)據(jù)庫,有時候我們需要將多個字符串拼接成一個字符串,以滿足特定的需求。而Oracle提供了個非常方便的函數(shù),就是WM_CONCAT函數(shù)。本文將詳細介紹WM_CONCA
    的頭像 發(fā)表于 12-06 09:51 ?1376次閱讀

    oracle拼接字符串函數(shù)

    在Oracle,我們可以使用 CONCAT 函數(shù)來拼接字符串。CONCAT 函數(shù)接受兩個參數(shù),它將這兩個參數(shù)連接起來并返回相應的字符串結果
    的頭像 發(fā)表于 12-06 09:49 ?2748次閱讀

    java equalsignorecase性能問題介紹

    java的equalsIgnoreCase方法是用于比較兩個字符串是否相等,但不考慮大小寫的差異。在使用equalsIgnoreCase方法時,可能會涉及到性能的問題。這篇文章將細致地討論
    的頭像 發(fā)表于 12-03 11:05 ?7w次閱讀

    c語言字符串定義

    字符串的定義、初始化、操作和常見問題。 字符串的定義和初始化 在C語言中,字符串被定義為一個字符數(shù)組。可以通過種方式來定義和初始化
    的頭像 發(fā)表于 11-24 10:02 ?1742次閱讀

    python如何統(tǒng)計字符串字母個數(shù)

    Python中統(tǒng)計字符串字母個數(shù)的方法有多種,下面我會詳細介紹些常用的方法。 方法:使用循環(huán)遍歷
    的頭像 發(fā)表于 11-23 16:29 ?1.3w次閱讀

    java equalsignorecase性能

    java的equalsIgnoreCase方法是用于比較兩個字符串是否相等,忽略大小寫。它返回個布爾值,如果兩個字符串相等,則返回tru
    的頭像 發(fā)表于 11-17 16:45 ?6.7w次閱讀

    java字符串轉(zhuǎn)化為日期格式

    在Java,字符串轉(zhuǎn)化為日期格式是個常見的需求。日期格式在處理時間相關的操作時非常重要,它可以用來表示段時間的開始和結束,也可以用來計算時間差等。本文將詳細介紹如何將
    的頭像 發(fā)表于 11-17 16:38 ?2835次閱讀

    mysql字符串包含某個字符串

    將詳盡、詳實、細致地探討MySQL字符串包含的實現(xiàn)方法。 在MySQL,可以通過使用內(nèi)建函數(shù)和通配符來實現(xiàn)字符串包含的操作。下面將詳細介紹幾種常用的方法: 使用LIKE通配符: L
    的頭像 發(fā)表于 11-16 14:52 ?3579次閱讀