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ù)字符,核心思路是將字符串轉(zhuǎn)換為rune切片,利用map去重,再將去重后的rune切片轉(zhuǎn)換回字符串。關(guān)鍵在于理解rune類型和高效的去重方法。
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)換為大寫或小寫。例如:
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更快。
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ì)改變順序的操作。