什么是回文?
回文,汉语词语,指汉语中的回文语法,即把相同的词汇或句子,在下文中调换位置或颠倒过来,产生首尾回环的情况,叫做回文,也叫回环。
回文的经典案例
上海自来水来自海上
我们如何使用go语言实现回文判断呢?
我们来简单分析一下涉及到的知识点:
- 判断字符串中汉字的数量,难点是一个字符是不是汉字
- 回文判断:字符串从左往右读和从右往左读是一样的 就是回文
- 在go语言中中文要用rune类型
- 判断回文的基本思路是:字符串转成切片 for循环判断 如果正数N和倒数N是一致的,就是回文,否则就不是回文。
撸代码
为了方便大家更好的理解,在实现回文判断之前,先分享判断汉字数量、单词出现次数的方法。
判断字符串中汉字的数量
package main import ( "fmt" "unicode" ) func main() { // 判断字符串中汉字的数量 // 难点是一个字符是不是汉字 s1 := "hello掘金hah你好哇" // 1. 依次拿到字符串中的字符 // 2.判断当前这个字符是不是汉字 // 3.把汉字出现的次数累加 获得总数 var sum = 0 for _, c := range s1 { if unicode.Is(unicode.Han, c) { sum++ } } fmt.Println(sum) }
运行结果
和我们预期的一样,汉字数量为5。
统计 what do you do 每个单词出现的次数
package main import ( "fmt" "strings" ) func main() { s2 := "what do you do" s3 := strings.Split(s2, " ") //定义一个map 单词存储为map的key m := make(map[string]int, 10) for _, v := range s3 { if _, ok := m[v]; ok { m[v]++ } else { m[v] = 1 } } fmt.Println(m) }
运行结果
map[do:2 what:1 you:1]
回文判断
- 字符串从左往右读和从右往左读是一样的 就是回文
- 因为是中文 所以要用rune类型 字符串转成切片 for循环判断 如果正数N和倒数N是一致的,就是回文,否则就不是回文。
package main import ( "fmt" ) func main() { s4 := "上海自来水来自海上" r := make([]rune, 0, len(s4)) for _, v := range s4 { r = append(r, v) } fmt.Println(len(r)) for i := 0; i < len(r)/2; i++ { if r[i] != r[len(r)-1-i] { fmt.Println(s4 + ":不是回文") } } fmt.Println(s4 + ":是回文") }
运行结果
我们分别输入:上海自来水来自海上、上海自来水来自海上吗 来验证回文判断