3. 无重复字符的最长子串

  • java

先导题:https://blog.csdn.net/qq_43606119/article/details/135045019

滑动窗口,其实可以等价成一个队列,代码实现的时候可以直接用两个指针来规范。

判断字符是否已经出现过,用哈希表。

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int ans = Integer.MIN_VALUE;
        char[] chars = s.toCharArray();
        HashMap<Character, Integer> h = new HashMap<Character, Integer>();
        int l = 0, r = 0;
        while (r < s.length()) {
            if (h.containsKey(chars[r])) {
                int nextL = h.get(chars[r]) + 1;
                for (int i = l; i < nextL; i++) {
                    h.remove(chars[i]);
                }
                l = nextL;
            }
            h.put(chars[r], r++);
            ans = Math.max(ans, r - l);
        }
        return ans == Integer.MIN_VALUE ? 0 : ans;
    }
}

进一步简化

将哈希表中的元素移除这一步是没有必要的,因为还是要把同样的元素添加进去:

int nextL = h.get(chars[r]) + 1;
for (int i = l; i < nextL; i++) {
    h.remove(chars[i]);
}

这里其实我们只是需要记录l的大小,从而计算长度,所以直接让l取最大值即可(这是因为如果不取最大值,像abba这样的字符串,l的值变化:0-2-1,倒回去了,显然不行):

l = Math.max(l, h.get(chars[r]) + 1);
class Solution {
    public int lengthOfLongestSubstring(String s) {
        int ans = Integer.MIN_VALUE;
        char[] chars = s.toCharArray();
        HashMap<Character, Integer> h = new HashMap<Character, Integer>();
        int l = 0, r = 0;
        while (r < s.length()) {
            if (h.containsKey(chars[r])) {
                l = Math.max(l, h.get(chars[r]) + 1);
            }
            h.put(chars[r], r++);
            ans = Math.max(ans, r - l);
        }
        return ans == Integer.MIN_VALUE ? 0 : ans;
    }
}

拓展:

1. HashMap

  • 描述:HashMap是Map接口的哈希表实现。它存储键值对映射,提供了常数时间复杂度的添加、删除和查找操作。
  • 特点:键不允许重复,值可以重复,提供了快速的查找能力。
  • 示例用途:适合需要快速查找键值对的场景。
    在Java中,HashMap是一个非常常用的数据结构,用于存储键值对映射。以下是使用HashMap的基本方法:

导入HashMap类

首先,需要导入HashMap类,通常是这样做:

import java.util.HashMap;

创建HashMap对象

要创建一个HashMap对象,可以使用以下语法:

HashMap<KeyType, ValueType> map = new HashMap<>();

其中,KeyType是键的数据类型,ValueType是值的数据类型。

添加键值对

可以使用put方法向HashMap中添加键值对:

map.put(key1, value1);
map.put(key2, value2);
// 以此类推

获取值

可以使用get方法通过键来获取对应的值:

ValueType value = map.get(key);

删除键值对

可以使用remove方法来删除指定键的键值对:

map.remove(key);

检查键是否存在

可以使用containsKey方法来检查HashMap中是否包含特定的键:

boolean containsKey = map.containsKey(key);

遍历HashMap

可以使用不同的方式来遍历HashMap,比如使用keySetentrySet或者迭代器。

  • 使用keySet遍历:
for (KeyType key : map.keySet()) {
    ValueType value = map.get(key);
    // 处理键值对
}
  • 使用entrySet遍历:
for (Map.Entry<KeyType, ValueType> entry : map.entrySet()) {
    KeyType key = entry.getKey();
    ValueType value = entry.getValue();
    // 处理键值对
}

其他方法

HashMap还提供了其他一些常用的方法,比如size用于获取HashMap的大小,clear用于清空HashMap中的所有键值对等。

示例

以下是一个简单的示例,演示了如何创建HashMap、向其中添加键值对、获取值以及遍历HashMap:

import java.util.HashMap;

public class Main {
    public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<>();
        
        map.put("apple", 3);
        map.put("banana", 5);
        map.put("orange", 7);
        
        int numberOfApples = map.get("apple");
        System.out.println("Number of apples: " + numberOfApples);
        
        for (String fruit : map.keySet()) {
            int count = map.get(fruit);
            System.out.println("Number of " + fruit + "s: " + count);
        }
    }
}

2. String怎么转换为字符数组

String str = "Hello";  
char[] charArray = str.toCharArray();  

3. Character, Integer和char, int的区别

在Java中,CharacterInteger是类(Class),而charint是基本数据类型(Primitive Data Type)。

Character vs. char

  • char是Java的一个基本数据类型,用于表示单个字符,采用单引号括起来,例如:'A'
  • Character是Java中用来表示字符的包装类,它提供了一些实用的方法来操作字符。可以使用Character类来进行字符的大小写转换、判断字符是否是字母或数字等操作。

Integer vs. int

  • int是Java的一个基本数据类型,用于表示整数,它没有小数部分,例如:123
  • Integer是Java中用来表示整数的包装类,它提供了许多实用的方法来操作整数。可以使用Integer类来进行整数的转换、比较大小等操作。

示例

以下是一个简单的示例,演示了基本数据类型和其对应的包装类之间的转换:

// 使用基本数据类型
int num1 = 10;
char char1 = 'A';

// 使用包装类
Integer num2 = Integer.valueOf(num1);
Character char2 = Character.valueOf(char1);

在这个示例中,intchar是基本数据类型,而IntegerCharacter是对应的包装类。

在Java中,你当然可以使用HashMap来表示字符到整数的映射关系,但是在实际情况中,使用HashMap更为常见并且更具有灵活性和可读性。

使用Character而不是char

当你使用HashMap时,你在存储字符时会使用Character类的对象而不是基本数据类型char。这是因为在Java的泛型中,无法直接使用基本数据类型,而需要使用对应的包装类。
使用Character类可以让你在需要时进行字符的各种操作,比如大小写转换、判断是否为字母等,这提供了更多的灵活性。

使用Integer而不是int

同样地,使用HashMap允许你使用Integer对象来表示整数值,这样可以更方便地进行一些操作,比如将整数转换为字符串、进行格式化输出等。

你可能感兴趣的:(LeetCode,java,开发语言,算法,数据结构)