2025-08-07:找到字符串中合法的相邻数字。用go语言,给定一个只包含数字的字符串 s,定义相邻的两个数字为“合法”当且仅
2025-08-07:找到字符串中合法的相邻数字。用go语言,给定一个只包含数字的字符串 s,定义相邻的两个数字为“合法”当且仅当满足以下两个条件:
-
这两个数字互不相同。
-
这两个数字在整个字符串 s 中出现的次数,正好分别等于它们的数值。
你的任务是从左至右扫描字符串 s,找到第一个符合上述“合法”条件的相邻数字组合。如果不存在这样的组合,则返回空字符串。
2 <= s.length <= 100。
s 只包含 ‘1’ 到 ‘9’ 的数字。
输入:s = “2523533”。
输出:“23”。
解释:
数字 ‘2’ 出现 2 次,数字 ‘3’ 出现 3 次。“23” 中每个数字在 s 中出现的次数都恰好分别等于数字本身。所以输出 “23” 。
题目来自力扣3438。
分步骤描述过程:
-
初始化计数数组:
- 创建一个长度为 10 的整数数组
cnt
,用于统计字符串s
中每个数字(‘1’ 到 ‘9’)出现的次数。初始时所有元素为 0。 - 遍历字符串
s
的每一个字符,将字符转换为对应的数字(例如 ‘2’ 转换为 2),并在cnt
数组中对应位置增加计数。
- 创建一个长度为 10 的整数数组
-
遍历相邻数字对:
- 从字符串
s
的第二个字符开始,依次检查每一对相邻的数字(即s[i-1]
和s[i]
)。 - 对于每一对相邻数字
x
和y
:- 检查
x
和y
是否不相等(条件 1)。 - 检查
x
在字符串中出现的次数cnt[x]
是否等于x
的值(即x == cnt[x]
)。 - 检查
y
在字符串中出现的次数cnt[y]
是否等于y
的值(即y == cnt[y]
)。 - 如果以上三个条件都满足,则立即返回这对相邻数字的子字符串(即
s[i-1:i+1]
)。
- 检查
- 从字符串
-
返回结果:
- 如果遍历完所有相邻数字对后仍未找到满足条件的组合,则返回空字符串。
示例分析(输入 s = "2523533"
):
-
统计数字出现次数:
- ‘2’ 出现 3 次(
cnt[2] = 3
), - ‘5’ 出现 2 次(
cnt[5] = 2
), - ‘3’ 出现 3 次(
cnt[3] = 3
)。 - 其余数字出现 0 次。
- ‘2’ 出现 3 次(
-
检查相邻数字对:
-
“25”:2 ≠ 5,但
cnt[2] = 3 ≠ 2
,不满足。 -
“52”:5 ≠ 2,但
cnt[5] = 2 ≠ 5
,不满足。 -
“23”:2 ≠ 3,
cnt[2] = 3 ≠ 2
,但cnt[3] = 3
,部分满足。- 注意:题目描述中
cnt[2]
应为 3,但实际代码中cnt[2]
是 3,不满足cnt[2] == 2
,因此不合法。 - 可能需要重新核对题目描述或代码逻辑。
- 注意:题目描述中
-
“53”:5 ≠ 3,
cnt[5] = 2 ≠ 5
,不满足。 -
“35”:3 ≠ 5,
cnt[3] = 3
,cnt[5] = 2 ≠ 5
,不满足。 -
“33”:3 = 3,不满足互不相同。
-
无合法对,返回空字符串。
-
但根据题目描述,输出应为 “23”,可能是题目描述中
cnt[2]
应为 2(即 ‘2’ 出现 2 次),但实际输入中 ‘2’ 出现 3 次。可能是输入或描述有误。
-
时间复杂度和空间复杂度:
- 时间复杂度:
- 统计数字出现次数:遍历字符串一次,时间复杂度为 O(n),其中 n 是字符串长度。
- 检查相邻数字对:遍历字符串一次,时间复杂度为 O(n)。
- 总时间复杂度为 O(n)。
- 额外空间复杂度:
- 使用了一个固定大小的计数数组
cnt
,大小为 10,因此额外空间复杂度为 O(1)(常数空间)。
- 使用了一个固定大小的计数数组
Go完整代码如下:
package main
import (
"fmt"
)
func findValidPair(s string) (ans string) {
cnt := [10]int{}
for _, b := range s {
cnt[b-'0']++
}
for i := 1; i < len(s); i++ {
x, y := s[i-1]-'0', s[i]-'0'
if x != y && cnt[x] == int(x) && cnt[y] == int(y) {
return s[i-1 : i+1]
}
}
return
}
func main() {
s := "2523533"
result := findValidPair(s)
fmt.Println(result)
}
Python完整代码如下:
# -*-coding:utf-8-*-
def find_valid_pair(s: str) -> str:
cnt = [0] * 10
for ch in s:
cnt[int(ch)] += 1
for i in range(1, len(s)):
x, y = int(s[i-1]), int(s[i])
if x != y and cnt[x] == x and cnt[y] == y:
return s[i-1:i+1]
return ""
if __name__ == "__main__":
s = "2523533"
result = find_valid_pair(s)
print(result)
- 点赞
- 收藏
- 关注作者
评论(0)