Longest Substring Without Repeating Characters 最长无重复子串

LeetCode题解 5. Longest Substring Without Repeating Characters

题目

Given a string, find the length of the longest substring without repeating characters.

Examples:

Given “abcabcbb”, the answer is “abc”, which the length is 3.

Given “bbbbb”, the answer is “b”, with the length of 1.

Given “pwwkew”, the answer is “wke”, with the length of 3.

Note that the answer must be a substring, “pwke” is a subsequence and not a substring.

题目大意:从一个字符串中找到最长无重复的子串。

思路

顺序遍历字符串,用一个map记录每个字符的出现次数;

当有字符重复时,记录下从开始位置到当前前一个位置的子串与长度;

在与最长子串进行长度比较,取出最长子串;

清空map,继续按照之前的位置往下遍历查找子串。

代码实现(Go语言)

package main

import (
	"fmt"
)

func main() {
    str := "abcbefd"
    size := len(str)               // 字符串长度
	var maxLength int              // 最大子串长度
	var maxStr string              // 最长子串
    set := make(map[byte]int32, 0) // 用来记录字符出现次数

	// 循环遍历字符串
	for i := 0; i < size; i++ {
		var index int // 用来记录重复字符出现的位置
		for j := i; j < size; j++ {
			// 当字符重复时,记录位置,退出当前循环
			if set[str[j]] != 0 {
                index = j
				break
			}

			// 没有重复字符,在map中记录
            set[str[j]] = 1
		}

		// 如果一直没有出现重复,说明遍历到了字符串尾端
		if index == 0 {
            index = size
		}

		// 比较最长子串长度,获取最长子串
        length := index - i
		if length > maxLength {
            maxLength = length
            maxStr = str[i:index]
		}

		// 清空记录字符的map,这里比较暴力,重新申请空间了
        set = make(map[byte]int32, 0)

		// 当剩余子串长度小于最长子串长度,没有遍历下去的必要了,提升效率
		if maxLength >= (size - i) {
			break
		}
	}

    fmt.Println(maxLength, maxStr)
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值