非重复最长子串的长度
非重复最长子串的长度
题目
给定一个字符串,找出没有重复字符的最长子字符串的长度。
示例1:
输入:String="aabccbb"
输出:3
解释:"abc"
示例2:
输入:String="abbbb"
输出:2
解释:"ab"
解答1:滑动窗口
import java.util.*;
class NoRepeatSubstring {
  public static int findLength(String str) {
    int windowStart = 0, maxLength = 0;
    Map<Character, Integer> charIndexMap = new HashMap<>();
    // 扩大窗口[windowStart, windowEnd]
    for (int windowEnd = 0; windowEnd < str.length(); windowEnd++) {
      char rightChar = str.charAt(windowEnd);
      // 如果map已包含“rightChar”,就从头开始缩小窗口,这样“rightChar”便只出现一次
      if (charIndexMap.containsKey(rightChar)) {
        // 在当前窗口中,我们将在其前一个索引之后没有任何“rightChar”,如果“windowStart”已经领先于“rightChar”的最后一个索引,我们将保留“windowStart”
        windowStart = Math.max(windowStart, charIndexMap.get(rightChar) + 1);
      }
      charIndexMap.put(rightChar, windowEnd); // 将'rightChar'添加到map中
      maxLength = Math.max(maxLength, windowEnd - windowStart + 1); // 记住当前最长的长度
    }
    return maxLength;
  }
  public static void main(String[] args) {
    System.out.println("Length of the longest substring: " + NoRepeatSubstring.findLength("aabccbb"));
    System.out.println("Length of the longest substring: " + NoRepeatSubstring.findLength("abbbb"));
    System.out.println("Length of the longest substring: " + NoRepeatSubstring.findLength("abccde"));
  }
}
class NoRepeatSubstring {
  static findLength(str) {
    let windowStart = 0;
    let maxLength = 0;
    const charIndexMap = new Map();
    for (let windowEnd = 0; windowEnd < str.length; windowEnd++) {
      const rightChar = str.charAt(windowEnd);
      if (charIndexMap.has(rightChar)) {
        windowStart = Math.max(windowStart, charIndexMap.get(rightChar) + 1);
      }
      charIndexMap.set(rightChar, windowEnd);
      maxLength = Math.max(maxLength, windowEnd - windowStart + 1);
    }
    return maxLength;
  }
}
console.log("Length of the longest substring: " + NoRepeatSubstring.findLength("aabccbb"));
console.log("Length of the longest substring: " + NoRepeatSubstring.findLength("abbbb"));
console.log("Length of the longest substring: " + NoRepeatSubstring.findLength("abccde"));
class NoRepeatSubstring:
    def findLength(string):
        windowStart = 0
        maxLength = 0
        charIndexMap = {}
        for windowEnd in range(len(string)):
            rightChar = string[windowEnd]
            if rightChar in charIndexMap:
                windowStart = max(windowStart, charIndexMap[rightChar] + 1)
            charIndexMap[rightChar] = windowEnd
            maxLength = max(maxLength, windowEnd - windowStart + 1)
        return maxLength
print("Length of the longest substring:", NoRepeatSubstring.findLength("aabccbb"))
print("Length of the longest substring:", NoRepeatSubstring.findLength("abbbb"))
print("Length of the longest substring:", NoRepeatSubstring.findLength("abccde"))
package main
import (
	"fmt"
)
func findLength(str string) int {
	windowStart := 0
	maxLength := 0
	charIndexMap := make(map[byte]int)
	for windowEnd := 0; windowEnd < len(str); windowEnd++ {
		rightChar := str[windowEnd]
		if _, ok := charIndexMap[rightChar]; ok {
			windowStart = max(windowStart, charIndexMap[rightChar]+1)
		}
		charIndexMap[rightChar] = windowEnd
		maxLength = max(maxLength, windowEnd-windowStart+1)
	}
	return maxLength
}
func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}
func main() {
	fmt.Println("Length of the longest substring:", findLength("aabccbb"))
	fmt.Println("Length of the longest substring:", findLength("abbbb"))
	fmt.Println("Length of the longest substring:", findLength("abccde"))
}
