字符串

作者: 每皮1024 | 来源:发表于2022-07-24 17:43 被阅读0次

    前言

    字符串类型的题目,个人在一些特定语言常用的字符串方法比较容易忘记,比如长度、某个位置的字符的获取、遍历等等。

    题目

    一、5. 最长回文子串

    这个方法我主要使用了中心扩散法,下面用圆括号标识的是特定语言(比如 Golang )的一些常见使用方法
    Golang

    func longestPalindrome(s string) string {
        // (1). 获取字符串长度
        if len(s) == 0 {
            return ""
        }
    
        // 我们需要从一个字符扩展,或者从两个字符之间开始扩展
        // start 和 end 是最长回文字符串的头和尾
        var start, end int
        // (2). 遍历字符串,它默认左边是 index 和对应的 character,如果不需要 character,可以省略,如下
        for i := range s {
            odd := expandAroundCenter(s, i, i)
            even:= expandAroundCenter(s, i, i+1)
            var len int
            if odd > even {
                len = odd
            } else {
                len = even
            }
            if len > (end - start + 1) {
                start = i - (len-1)/2
                end = i + len/2
            }
        }
        // (3). 获取字符串的一部分,左闭右开
        return s[start:end+1]
    }
    
    // 这个函数默认 left 是在正常范围内,right 可能会等于 len(s), 并且不保证 left 和 right 的值是一样的
    func expandAroundCenter(s string, left int, right int) int {
        // 先根据假定做好边界处理, 其实下边的 for 循环已经覆盖了  s[left] != s[right] 这种场景,这个判断已经是冗余的,但为了更明显起见,这里还是写了一下
        // (4). 获取字符串在某个特定位置的 character
        if right == len(s) || s[left] != s[right] {
            return 1
        }
        // (5). golang 里边 for 循环第三部分如果有两个变量应当如下边的方式写,不能写作 "left--, right++"
        for ; left >= 0 && right < len(s) && s[left] == s[right]; left, right = left - 1, right + 1 {
        }
        // 注意,这个地方我写错了,写成了 right - left + 1,但是要知道实际上跳出上边的 for 循环时,left 和 right 的字符已经不同或者数组越界了,所以其实应该是下面这样的
        return right - left - 1
    }
    

    相关文章

      网友评论

          本文标题:字符串

          本文链接:https://www.haomeiwen.com/subject/ficwirtx.html