這篇文章主要介紹了Java如何刪除字符串中的所有相鄰重復項的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Java如何刪除字符串中的所有相鄰重復項文章都會有所收獲,下面我們一起來看看吧。
算法:
棧一個比較常用的場景就是對字符串的操作,比如去重,退格,字符串表示的路徑等,操作往往比較簡單。
1、先把最為條件判斷的字符串入棧
2、根據新到來的元素判斷要不要出棧
3、最為比較的元素往往存在棧內,比較的時候,有時候比較棧頂元素,有時候整個棧都要比較
題目1: 刪除字符串中的所有相鄰重復項
代碼實現:
func removeDuplicates(S string) string { ss := []byte(S) var stacks []byte for i := 0; i< len(ss);i++ { if len(stacks) != 0 { j:= len(stacks)-1 if ss[i] == stacks[j]{ // 與棧頂元素相同的話,刪除棧內數據并且也不入棧 stacks = stacks[:j] continue } } stacks = append(stacks,ss[i])// 其他情況都入棧 } return string(stacks) } /* 棧的使用,先入棧,后面的元素與棧頂元素相同,出棧并且新元素不入棧。 其他場景都入棧。 */
題目2: 比較含退格的字符串
代碼實現:
func backspaceCompare(S string, T string) bool { s := getStack(S) t := getStack(T) return s == t } func getStack(S string) string { ss := []byte(S) var stacks []byte for i:=0;i<len(ss);i++{ if ss[i] != '#' { stacks = append(stacks,ss[i]) } else { if len(stacks) > 0 { // 注意 ”#abc“這種#在最前面的情況 stacks = stacks[:len(stacks)-1] } } } return string(stacks) }
題目3:簡化路徑
代碼實現:
import "strings" func simplifyPath(path string) string { tmps := strings.Split(path,"/") var paths []string for _,s:=range tmps { if len(s) != 0{ paths = append(paths,s) } } // fmt.Println("name",paths) var stacks []string for i:=0;i<len(paths);i++{ if paths[i]==".." { if len(stacks) > 0{ stacks=stacks[:len(stacks)-1] } continue } if paths[i]!="."{ stacks=append(stacks,paths[i]) } } // fmt.Println("name",stacks,len(stacks)) resStr :="" for idx,s:=range stacks { resStr += s if idx != len(stacks)-1{ resStr += "/" } } return "/"+resStr }