【日更刷题】1417. 重新格式化字符串

101 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情

一、题目描述:

1417. 重新格式化字符串 - 力扣(LeetCode)

给你一个混合了数字和字母的字符串 s,其中的字母均为小写英文字母。

请你将该字符串重新格式化,使得任意两个相邻字符的类型都不同。也就是说,字母后面应该跟着数字,而数字后面应该跟着字母。

请你返回 重新格式化后 的字符串;如果无法按要求重新格式化,则返回一个 空字符串

 

示例 1:

输入:s = "a0b1c2"
输出:"0a1b2c"
解释:"0a1b2c" 中任意两个相邻字符的类型都不同。 "a0b1c2", "0a1b2c", "0c2a1b" 也是满足题目要求的答案。

示例 2:

输入:s = "leetcode"
输出:""
解释:"leetcode" 中只有字母,所以无法满足重新格式化的条件。

示例 3:

输入:s = "1229857369"
输出:""
解释:"1229857369" 中只有数字,所以无法满足重新格式化的条件。

示例 4:

输入:s = "covid2019"
输出:"c2o0v1i9d"

示例 5:

输入:s = "ab123"
输出:"1a2b3"

提示:

  • 1 <= s.length <= 500
  • s 仅由小写英文字母和/或数字组成。

二、思路分析:

将字母和数字分离,字母的存入strings,数字的存入numbers;

判断如果strings的长度+1小于numbers的长度, 或是numbers的长度+1小于strings的长度,说明字母和数字的长度至少相差两个,不能形成交叉连接,直接返回“”;

找出strings和numbers最长和最短的长度,遍历,将strings和numbers交叉放入result,最终返回result的字符串表示。

三、AC 代码:

func reformat(s string) string {
	numbers := make([]rune, 0)
	strings := make([]rune, 0)

	for _, v := range s {
		if v >= 'a' && v <= 'z' {
			strings = append(strings, v)
		} else {
			numbers = append(numbers, v)
		}
	}

	stringsLen, numbersLen := len(strings), len(numbers)
	if stringsLen < numbersLen-1 || numbersLen < stringsLen-1 {
		return ""
	}

	result := make([]rune, 0)
	maxLen, minLen := stringsLen, numbersLen
	maxs, mins := strings, numbers
	if numbersLen > maxLen {
		maxLen, minLen = minLen, maxLen
		maxs, mins = mins, maxs
	}

	for k, v := range maxs {
		if k < maxLen {
			result = append(result, v)
		}
		if k < minLen {
			result = append(result, mins[k])
		}
	}

	return string(result)
}

四、总结:

1417. c++几乎双百的贪心解法 - 重新格式化字符串 - 力扣(LeetCode)