LeetCode125 验证回文串|Go主题月

598 阅读1分钟

LeetCode中文网第125题 验证回文串

定义:

回文串:从前往后读和从后往前读都一样的字符串,例如 radar、toot,以及 madam。

题目:

给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

Go语言实现1

func isPalindrome(s string) bool {
	var srcStr []rune
	var reverseStr []rune
	for _, char := range s {
                // 数字或字母统一小写才放入
		if unicode.IsNumber(char) ||
			unicode.IsLetter(char) {
			srcStr = append(srcStr, unicode.ToLower(char))
		}
	}
        // 把srcStr数据拷贝到拟翻转后的reverseStr切片里
	reverseStr = append(reverseStr, srcStr...)
        // 切片数据翻转
	reverseAny(reverseStr)
        // 比较翻转前后的切片数据是否一样,一致则为回文,否则不为回文
	if string(srcStr) == string(reverseStr) {
		return true
	} else {
		return false
	}
}

func reverseAny(s interface{}) {
	n := reflect.ValueOf(s).Len()
	swap := reflect.Swapper(s)
	for i, j := 0, n-1; i < j; i, j = i+1, j-1 {
		swap(i, j)
	}
}

运行结果

执行结果:通过
执行用时:4 ms
内存消耗:5 MB

回文.png

Go语言实现2

这里利用了双端队列数据结构进行同时从两头取数据,如果出现不相等,则明显不是回文。

func isPalindrome(s string) bool {
	// 构建双端队列
	dqueue := NewArrayDeque()
	for _, char := range s {
		// 数字或字母统一小写才放入队列
		if unicode.IsNumber(char) ||
			unicode.IsLetter(char) {
			dqueue.AddFront(unicode.ToLower(char))
		}
	}
	// 判断是否为回文, 默认为回文
	isPal := true
	// 从两端提取字符,判断是否相同,出现不同则为非回文
	// 直到队列长度为1或为2时(两端相同)则为回文
	for dqueue.Len() > 1 && isPal {
		// 获取队尾数据
		left := dqueue.RemoveBack()
		// 获取队首数据
		right := dqueue.RemoveFront()
		// 判断是否相同
		if left != right {
			isPal = false
			break
		}
	}
	return isPal
}

type Element interface{}

type Deque interface {
	// 向队首添加元素
	AddFront(e ...Element)

	// 向队尾添加元素
	AddBack(e ...Element)

	// 队首元素出队
	RemoveFront() Element

	// 队尾元素出队
	RemoveBack() Element

	// 队列长度
	Len() int
}

type ArrayDeque []Element

func (s *ArrayDeque) AddFront(e ...Element) {
	ln := len(e)
	rev := make([]Element, ln)
	for i, v := range e {
		rev[ln-i-1] = v
	}
	*s = append(rev, *s...)
}

func (s *ArrayDeque) AddBack(e ...Element) {
	*s = append(*s, e...)
}

func (s *ArrayDeque) RemoveFront() Element {
	if s.Empty() {
		return nil
	}
	v := (*s)[0]

	// 出队
	*s = (*s)[1:]
	return v

}

func (s *ArrayDeque) RemoveBack() Element {
	if s.Empty() {
		return nil
	}
	ln := len(*s)
	v := (*s)[ln-1]

	// 出队
	*s = (*s)[:ln-1]
	return v
}

func (s *ArrayDeque) Size() int {
	return len(*s)
}

func NewArrayDeque() Deque {
	return &ArrayDeque{}
}

以上为验证回文的两种解题思路的Golang语言的实现。