常見字串試題集合總結

2021-10-24 07:18:27 字數 4256 閱讀 8225

4、 求所有碎片的平均長度

5、用於匹配模式串的kmp(knuth-morris-pratt)演算法

5、滑動視窗

不論是左旋轉還是右旋轉,即把前面的子串往後放還是後面的子串往前放,最簡潔的方法都是先把原始串複製乙份並拼接起來,然後按需擷取。

本題鏈結在此,**如下,可以將前面那個字元放到末尾:

public string reverseleftwords

(string s,

int n)

如若不能使用substring()方法,則應使用stringbuilder來重新接受新次序的字元,最後組成乙個符合要求的字串。

方法二

public string reverseleftwords

(string s,

int n)

return sb.

tostring()

;}

這個題思路較多,我用的是官方的先將字串連續相同的段計數,並將計數值儲存起來,然後每相鄰的兩個計數值都能貢獻min次符合要求的子串。本題鏈結

計數並儲存:

list

counts =

newarraylist

<

>()

;int ptr =0;

int len = s.

length()

;while

(ptr < len)

counts.

add(cnt)

;}

然後統計總次數:

int res =0;

for(

int i =

0; i < counts.

size()

-1; i++

)return res;

首先,這個題有兩個要求:1)只考慮字母和數字字元;2)忽略字母大小寫

這裡涉及到兩個api,乙個是包裝類的character.isletterordigit(char a),用來判斷a字元是否是字母或數字,是則返回true;另乙個是character.tolowercase(char a),用來將字元a轉換成小寫(當然用轉換成大寫的也可以)。

然後,這裡需要乙個新的容器來盛裝「**」後的字串,這裡選用的是stringbuider,得到新的字串不妨即為sb串,到這裡貌似只需要呼叫reverse()方法,然後返回兩者equals()的值即可。

然而,卻犯了兩個基本的錯誤。

錯誤一:reverse()方法是在原始串上改動,一旦呼叫執行,原始串就找不到了。

解決方案:呼叫reverse()之前將原始串儲存起來,但要注意新new乙個物件,不然呼叫reverse()後會把唯一的物件反轉,同樣丟失了原始串。

錯誤二:stringbuilder類中沒有重寫equals()方法,呼叫後執行的是父類object中的==,比較位址。

解決方案:呼叫tostring()方法,轉成string。

**如下:

public

static

boolean

ispalindrome

(string s)

} stringbuilder sb1 =

newstringbuilder

(sb)

; sb.

reverse()

;return sb1.

tostring()

.equals

(sb.

tostring()

);}

題目鏈結

這題的思路就是先統計每乙個字元出現的次數,並將次數按不同字元儲存起來,然後每乙個字元都可以最多使用count/2*2次(/為整數除法),最後若有奇數個的字元,應當加入乙個當做中軸線,如此便可達到最長。

官方**如下:

public

intlongestpalindrome

(string s)

return ans;

}

題目描述:乙個由小寫字母組成的字串可以看成一些同一字母的最大碎片組成的。例如,「aaabbaaac"是由下面碎片組成的:『aaa』,『bb』,『c』。牛牛現在給定乙個字串,請你幫助計算這個字串的所有碎片的平均長度是多少。輸入"aaabbaaac」,結果為(3+2+1) / 3 = 2.00。(說明:結果不取整)

此題與上一「最長回文子串」但實則是兩種題目,本題每次統計的並不是所有相同字元的數目,比如用例中「aaa」有兩個,但只需要乙個,而且記為一段碎片。

**如下:

public

static

void

main

(string[

] args)

char pre_c = s.

charat(0

), cur_c;

stringbuffer sb =

newstringbuffer()

; sb.

(pre_c)

;for

(int i =

1; i < s.

length()

; i++

)else

pre_c = cur_c;

} list.

add(sb.

tostring()

);set

set =

newhashset

<

>()

;for

(string s1 : list)

int t_len =

0, t_num =0;

for(string s1 : set)

system.out.

println

(string.

format

("%.2f"

, t_len *

1.0/ t_num));

}

knuth-morris-pratt分別代表三個科學家,以銘記他們的貢獻。

所以該演算法的內涵和名稱kmp沒有邏輯聯絡,演算法的關鍵在於構建乙個pmt(partial match table,部分匹配陣列),例如下方**中的calpmtvalues()方法,就是用來構建pmt的。pmt的原理及作用建議從此進入鏈結,最好多讀幾個回答,找乙個自己能理解的,當然我覺得更為容易理解的方式是在紙面上一步一步推演完全。

得到pmt後,就可以在text中搜尋pattern時,一旦遭遇不匹配,text可以不必回退索引,而pattern回退的位置值記錄在pmt中,就可以達到o(n)(text長度為n,pattern長度為m)的時間複雜度。可以想象,如果不借助pmt,失配時將達到o(nm)。

**如下:

/**

* 用於搜尋text中每一次出現pattern串的位置(首索引)

* @param text(主串)

* @param pattern(模式串)

* @return 返回乙個裝有所有位置值的list

*/public list

search

(string text,string pattern)

if(text.

charat

(i)== pattern.

charat

(count))if

(count == pattern.

length()

)}return positions;

}/**

* 用於計算pmt陣列所有的值,每乙個值代表擷取的模式串的最長前、字尾集合的交集的最長子串的長度

* @param pattern

* @return 返回pmt陣列

*/public

int[

]calpmtvalues

(string pattern)

if(pattern.

charat

(maxlength)

== pattern.

charat

(i))

//並且將當前maxlength值賦給索引i處的pmt陣列中

pmt_values[i]

= maxlength;

}return pmt_values;

}

常見字串問題總結(三)

常見字串問題總結 三 字串問題中經常會有刪除某一字串的某乙個字元,可以是不同方式的刪除,比如將指定的字元刪除,刪除字元中的空格 包括字串的頭和尾 本文就列舉了部分有關字串刪除的問題。1.刪除字串中的空格,要求將字串前面和後面的所有空格都刪除,對字串中間,如果出現多個連續的空格,只保留乙個空格。inc...

java常見字串方法總結

說到這裡的方法總結,其實也不是自己寫的啦,就是通過學習和工作中,總結了一些常用的方法,拿出來與大家分享。我不生產方法,我只是方法的搬運工。有什麼不足,請同行們多多指教,共同進步 1.string類字元與字串操作方法 方法名稱 型別 描述 public char charat int index 普通...

常見字串操作方式總結

1 獲取字串長度 2 獲取尾部字串 非貪婪匹配刪除的部分,從字串左邊開始,刪除掉第乙個出現的 b 及其左邊所有的字串。貪婪匹配刪除的部分,從字串左邊開始,刪除掉最後乙個出現的 b 以及左邊所有的字串。3 獲取頭部字串 非貪婪匹配刪除的部分,從字串右邊開始,刪除掉第乙個出現的 b 及其右邊所有的字串。...