0
点赞
收藏
分享

微信扫一扫

Leetcode-字符串操作

小云晓云 2022-01-23 阅读 65
leetcode

文章目录


q6 Z字形变换


题目传送门


题解

这道题一看就是一道模拟题,找到规律做的会比较快,我看到一位大佬比较简便的做法。做法是先开一个二维数组(字符串数组),然后把相同的一行存到二维数组中的同一行中,那怎么确定同一行的下标呢?
我们以一个V型的字符串个数为一个周期n,n就等于2 * numRows - 2, 那么这个周期中每个字符在二维数组中的下标就是min(i%n, n - i%n)。如下图所示:

在这里插入图片描述

最后用strings.Join函数将二维数组中的字符拼接为一个字符串。

func convert(s string, numRows int) string {
	if numRows == 1 {
		return s
	}
	// 二维数组。把Z型字符串同一行的字符存到同一行中
	rows := make([]string, numRows)
	// 计算V型字符串的周期
	n := 2 * numRows - 2
	for i, char := range s {
		// 某个字符的下标应该是min(x, n - x)
		x := i % n
		rows[min(x, n - x)] += string(char)
	}
	// 最后将每一行的字符按顺序拼接为一个字符串
	return strings.Join(rows, "")
}

func min(a, b int) int {
	if a < b {
		return a
	} else {
		return b
	}
}

q14 最长公共前缀


题目传送门


题解

这题采用纵向比较法,首先把第一个字符串当作最长公共前缀与接下来的n-1个字符串去比较,在比较的过程中如果发现被比较的字符串已经到达末尾或者当前比较的两个字符不相等,就直接返回第一个字符串长度为i - 1的前缀。如果循环全部结束,就代表所有字符串相等,直接返回第一个字符串即可。

func longestCommonPrefix(strs []string) string {
	if len(strs) == 0 {
		return ""
	}
	for i := 0; i < len(strs[0]); i++ {
		for j := 1; j < len(strs); j++ {
			if i == len(strs[j]) || strs[j][i] != strs[0][i] {
				return strs[0][:i]
			}
		}
	}
	return strs[0]
}

q763 划分字母区间


题目传送门


题解

这道题用hash表来做非常简单。首先将每个字符最后出现的位置存到hash表中,然后遍历字符串,用一个变量index储存该段字符串中的字符,出现最后一次的位置,最大的那个下标。同时一边遍历一边用index与当前循环变量做比较,如果相等,就表示这一段的所有字符在后面都没有出现过。那么当前这段的长度就是i - pre。

func partitionLabels(s string) []int {
	hashTable := make(map[byte]int)
	res := make([]int, 0)
	for i, v := range s {
		hashTable[byte(v)] = i
	}
	index := 0
	pre := -1
	for i, v := range s {
		if index < hashTable[byte(v)] {
			index = hashTable[byte(v)]
		}
		if i == index {
			index = 0
			res = append(res, i - pre)
			pre = i
		}
	}
	return res
}

举报

相关推荐

0 条评论