2024-09-28:用go语言,给定一个字符串s,要求判断是否存在一个长度为2的子字符串, 在其反转后的字符串中也存在相同的子字符串。 如果存在这样的子字符串,则返回true; 如果不存在,则返回f

2024-09-28:用go语言,给定一个字符串s,要求判断是否存在一个长度为2的子字符串,

在其反转后的字符串中也存在相同的子字符串。

如果存在这样的子字符串,则返回true;

如果不存在,则返回false。

输入:s = “leetcode”。

输出:true。

解释:子字符串 “ee” 的长度为 2,它也出现在 reverse(s) == “edocteel” 中。

答案2024-09-28:

chatgpt

题目来自leetcode3083。

大体步骤如下:

1.我们在主函数main中首先初始化字符串s为"leetcode",然后调用isSubstringPresent来检查是否存在符合条件的子字符串。

2.在isSubstringPresent函数中,我们定义了一个长度为26的数组vis来表示字母的出现情况。我们遍历字符串s,逐个检查相邻的字符对(s[i-1], s[i]),
并将它们转换为对应的数组下标,用位运算来标记存在相同子字符串的情况。如果发现有某个字符已经标记过和当前字符组成的子字符串,那么就返回true。

3.最后,如果遍历完整个字符串后没有发现符合条件的子字符串,那么就返回false。

总的时间复杂度:

  • 遍历整个字符串s需要O(n)时间,其中n为字符串s的长度。

  • 每个字符的操作都是常数时间的。

  • 所以总的时间复杂度为O(n)。

总的额外空间复杂度:

  • 数组vis的大小是固定的,长度为26,所以空间复杂度为O(1)。

通过这种实现,我们可以在线性时间复杂度内解决该问题,并且使用的额外空间非常有限。

Go完整代码如下:

package main

import (
	"fmt"
)

func isSubstringPresent(s string) bool {
	vis := [26]int{}
	for i := 1; i < len(s); i++ {
		x, y := s[i-1]-'a', s[i]-'a'
		vis[x] |= 1 << y
		if vis[y]>>x&1 > 0 {
			return true
		}
	}
	return false
}
func main() {
	s:="leetcode"
	fmt.Println(isSubstringPresent(s))
}

在这里插入图片描述

Rust完整代码如下:

fn is_substring_present(s: &str) -> bool {
    let mut vis = [0; 26];
    for i in 1..s.len() {
        let x = s.as_bytes()[i - 1] as usize - 'a' as usize;
        let y = s.as_bytes()[i] as usize - 'a' as usize;
        vis[x] |= 1 << y;
        if vis[y] >> x & 1 > 0 {
            return true;
        }
    }
    false
}

fn main() {
    let s = "leetcode";
    println!("{}", is_substring_present(s));
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

福大大架构师每日一题

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值