题意

image.png

解题思路:

思路

  • 定义一个map存储(k, v),其中k值为字符,v值为字符位置:[abc];
  • 从i = 0开始,不断向后移动,直到map中有重复值[abca];
  • 遇到重复值则把队列的左边的元素移出[bca],重新更新开始位置start;
  • 继续移动i指针,当map中不存在重复值,更新字符串长度;

PHP 代码实现

  1. class Solution {
  2. function lengthOfLongestSubstring($s) {
  3. $hash = [];
  4. $start = 0;
  5. $maxStrLen = 0;
  6. for ($i = 0; $i < strlen($s); $i++) {
  7. if (isset($hash[$s[$i]]) && $start <= $hash[$s[$i]]) {
  8. $start = $hash[$s[$i]] + 1;
  9. } else {
  10. $maxStrLen = max($maxStrLen, $i - $start + 1);
  11. }
  12. $hash[$s[$i]] = $i;
  13. }
  14. return $maxStrLen;
  15. }
  16. function lengthOfLongestSubstring($s) {
  17. $counts = [];
  18. $i = 0; $j = 0;
  19. $maxStrlen = 0;
  20. for (; $i < strlen($s); ++$i) {
  21. for (; $j < strlen($s); ++$j) {
  22. if ($counts[$s[$j]] != 0) break;//表示出现过相同值
  23. $counts[$s[$j]] += 1;
  24. }
  25. $maxStrlen = max($maxStrlen, $j - $i);
  26. $counts[$s[$i]] -= 1;
  27. }
  28. return $maxStrlen;
  29. }
  30. }

GO 代码实现

  1. func lengthOfLongestSubstring(s string) int {
  2. var strMap = make(map[byte]int)
  3. start, maxStrLen := 0, 0
  4. for i := 0; i < len(s); i++ {
  5. if v, ok := strMap[s[i]]; ok {
  6. start = max(start, v + 1)
  7. }
  8. strMap[s[i]] = i
  9. maxStrLen = max(maxStrLen, i - start + 1)
  10. }
  11. return maxStrLen
  12. }
  13. func max(a, b int) int {
  14. if a > b {
  15. return a
  16. }
  17. return b
  18. }