Go語言如何刪除字符串中的重復(fù)字符

go語言中刪除字符串重復(fù)字符的核心方法是將字符串轉(zhuǎn)為rune切片,使用map記錄已出現(xiàn)字符并保留順序,最后將結(jié)果轉(zhuǎn)回字符串。此方法默認(rèn)區(qū)分大小寫;若需忽略大小寫,可在去重前統(tǒng)一轉(zhuǎn)為小寫或大寫,但會(huì)改變?cè)甲址拇笮懶问剑蝗粜璞A粼即笮懀瑒t需額外處理,增加實(shí)現(xiàn)復(fù)雜度。對(duì)于僅含ASCII字符的字符串,可用長度256的bool數(shù)組代替map以提升效率,但該方法不適用于unicode字符;非ascii字符需單獨(dú)處理。上述方法在遍歷過程中根據(jù)seen標(biāo)記決定是否添加字符,從而保證去重后的字符順序與原字符串一致。

Go語言如何刪除字符串中的重復(fù)字符

刪除go語言字符串中的重復(fù)字符,核心思路是將字符串轉(zhuǎn)換為rune切片,利用map去重,再將去重后的rune切片轉(zhuǎn)換回字符串。關(guān)鍵在于理解rune類型和高效的去重方法。

Go語言如何刪除字符串中的重復(fù)字符

package main  import (     "fmt"     "strings" )  func removeDuplicateChars(s string) string {     runeSlice := []rune(s)     seen := make(map[rune]bool)     result := []rune{}      for _, r := range runeSlice {         if !seen[r] {             seen[r] = true             result = append(result, r)         }     }      return string(result) }  func main() {     inputString := "programming"     uniqueString := removeDuplicateChars(inputString)     fmt.Println("Original String:", inputString)     fmt.Println("String with unique characters:", uniqueString)      inputString2 := "你好你好世界世界"     uniqueString2 := removeDuplicateChars(inputString2)     fmt.Println("Original String:", inputString2)     fmt.Println("String with unique characters:", uniqueString2)      // 考慮空字符串的情況     inputString3 := ""     uniqueString3 := removeDuplicateChars(inputString3)     fmt.Println("Original String:", inputString3)     fmt.Println("String with unique characters:", uniqueString3) }

如何處理大小寫敏感的去重?

大小寫敏感的去重,意味著’A’和’a’會(huì)被認(rèn)為是不同的字符。上面的代碼已經(jīng)實(shí)現(xiàn)了大小寫敏感的去重。如果需要忽略大小寫,可以在去重前將字符串統(tǒng)一轉(zhuǎn)換為大寫或小寫。例如:

Go語言如何刪除字符串中的重復(fù)字符

func removeDuplicateCharsCaseInsensitive(s string) string {     s = strings.ToLower(s) // 或者 strings.ToUpper(s)     runeSlice := []rune(s)     seen := make(map[rune]bool)     result := []rune{}      for _, r := range runeSlice {         if !seen[r] {             seen[r] = true             result = append(result, r)         }     }      return string(result) }  func main() {     inputString := "Programming"     uniqueString := removeDuplicateCharsCaseInsensitive(inputString)     fmt.Println("Original String:", inputString)     fmt.Println("String with unique characters (case-insensitive):", uniqueString) }

這種方法簡(jiǎn)單直接,但會(huì)修改原始字符串的大小寫。 如果需要保留原始大小寫,可以使用一個(gè)額外的map來記錄原始字符,并在最后恢復(fù)大小寫。這會(huì)增加代碼的復(fù)雜性。

立即學(xué)習(xí)go語言免費(fèi)學(xué)習(xí)筆記(深入)”;

除了map,還有其他更高效的去重方法嗎?

對(duì)于ASCII字符串,可以使用一個(gè)長度為256的bool數(shù)組來代替map。 這種方法在空間復(fù)雜度上與字符串的字符集大小有關(guān)。如果字符串只包含有限的字符集,使用數(shù)組會(huì)比map更快。

Go語言如何刪除字符串中的重復(fù)字符

func removeDuplicateCharsASCII(s string) string {     seen := [256]bool{}     result := []rune{}      for _, r := range s { //直接遍歷string,避免rune轉(zhuǎn)換         if r < 256 && !seen[r] { //確保是ASCII字符             seen[r] = true             result = append(result, r)         } else if r >= 256 {             // 處理非ASCII字符,可以忽略或者報(bào)錯(cuò),取決于需求             // 這里簡(jiǎn)單地忽略             if !strings.ContainsRune(string(result), r){                 result = append(result, r)             }          }     }      return string(result) }  func main() {     inputString := "programmingABCDEFG"     uniqueString := removeDuplicateCharsASCII(inputString)     fmt.Println("Original String:", inputString)     fmt.Println("String with unique characters (ASCII):", uniqueString)      inputString2 := "你好abc你好" //包含中文,測(cè)試非ASCII字符     uniqueString2 := removeDuplicateCharsASCII(inputString2)     fmt.Println("Original String:", inputString2)     fmt.Println("String with unique characters (ASCII):", uniqueString2)  }

需要注意的是,這種方法只適用于ASCII字符。對(duì)于包含Unicode字符的字符串,仍然需要使用map。 上面的代碼針對(duì)非ASCII字符進(jìn)行了簡(jiǎn)單處理,直接追加到結(jié)果中。實(shí)際應(yīng)用中,可能需要更復(fù)雜的邏輯。

如何保持去重后字符的原始順序?

上面的代碼已經(jīng)保持了原始順序。map的遍歷順序是不確定的,但我們遍歷的是原始字符串,并根據(jù)map來判斷是否需要添加到結(jié)果中。因此,結(jié)果中的字符順序與原始字符串中的順序一致。 確保代碼邏輯正確是關(guān)鍵,避免使用會(huì)改變順序的操作。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊5 分享