字串類的演算法題

2022-07-29 01:42:09 字數 1852 閱讀 6203

1、將0-1串進行排序,你可以交換任意兩個位置,問最少交換多少次?(用快速排序的思想)

int answer=0;

for(int i=0,j=len-1;ij)

2、刪除所有的a,並複製所有的b(字元陣列足夠大)

1>先刪除a,可以利用原來的字串空間

int n=0,numb=0;

for(int i=0;a[i];++i)

if(s[i]=='b')

}

2>複製b,技巧:倒著複製

int newlength=n+numb;

s[newlength]=0;

for(int i=newlength-1,j=n-1;j>=0;--j)

}

3、乙個字串只包含*和數字,請把字串內所有的*都放在開頭

方法一:數字的相對順序會變

for(int i=0,j=0;jj)

方法二:數字的相對順序不變

int j=n-1;

for(int i=n-1;i>=0;--i)

for(;j>=0;--j)

4、給定兩個串a,b,問b是否是a的子串的變位詞,例如輸入a=hello,b=lel,lle,ello都是true,但是b=elo是false,

解題思想:

滑動視窗的思想,動態維護乙個視窗,例如b的長度為3,我們考察a[0..2],a[1..3],a[2..4]是否和b是變位詞。

用乙個hash,基於字串的特性,用乙個[0..255]或[0..65535]的陣列,在這,暫且認為它們都是小寫英文本母,用[0-25]來表示b中的每個單詞出現的次數

用nonzero來存出現不同字母的個數,num來存每個字母出現的個數

1>先遍歷一下b,存b中的不同字母的個數nonzero,和每個字母出現的個數num;

int nonzero=0;

for(int i=0;ii)

2>再遍歷a[0..lenb-1],用b中的次數減去a中的乙個視窗內字元種類,如果結果全是0,則找到這樣的子串,注意:num的含義變為字元種類差。

for(int i=0;ii)

else

if(num[c]==-1)

}  if(nonzero==0)

return

true;

3>a視窗滑動右移

i=lenb;

新視窗:a[i-lenb+1..i]

舊視窗:a[i-lenb..i-1]

需要去掉a[i-lenb],加入a[i]

for(int i=lenb;ii)

else

if(num[c]==0)

//加入新視窗的最後乙個字母,因為中間的字母與舊視窗重疊。

c=a[i]-'a';

--num[c];

if(num[c]==0)

else

if(num[c]==-1)

if(nonzero==0)

return

true

;}

5、單詞翻轉

while(i例1: i'm a student變為student a i'm

方法:先將整個句子翻轉,tneduts a m'i

再將每個單詞單獨翻轉,student a i'm

例2:字串迴圈移位 abcd

bcda,cdab,dabc

思路: 長度為n,移動m次,相當於移動m%n次

將前m%n翻轉,再將後n-m%n翻轉,最後總體翻轉一下

字串演算法題總結

字串題做了將近乙個月,部落格上整理的20道和筆記中整理的十幾道,接近40道了,不總結一下整體的思路,大腦是一片混亂的。基礎題 考查對字串類相關的操作,其中重點掌握切片 連線和內建方法。子串題 子串題盡是困難題,但是同時也是非常經典的一類題目,需要好好掌握。常用的方法和技巧有滑動視窗 python c...

演算法題 暗黑的字串

乙個只包含 a b 和 c 的字串,如果存在某一段長度為3的連續子串中恰好 a b 和 c 各有乙個,那麼這個字串就是純淨的,否則這個字串就是暗黑的。例如 baacaaccbaaa 連續子串 cba 中包含了 a b c 各乙個,所以是純淨的字串 aabbccaabb 不存在乙個長度為3的連續子串包...

筆試 字串演算法題 翻轉分段字串

這個既然有人筆試完就問,那我還是敲乙份分享一下吧。題目大意 字串的問題,把字串按點的位置翻轉。要求時間複雜度o n 空間複雜度o 1 例如 對於字串 www.hyzhou.com.cn 輸出 cn.com.hyzhou.www 簡單明瞭,就不寫注釋了,是在看不懂,自己除錯執行看看過程就懂了。incl...