03无重复字符的最长子串

这个题目
首先来把字符串转换为数组
在Java里面将字符串转换为数组的方法
1.用tocharArray

char[] chars=s.tocharArray();

2.用split
假设[1,2,3,4,5]
char[] chars=s.split(',')
或者直接分割

String[] strArray = str.split("");

3.使用 Apache Commons Lang
如果你可以使用外部库,Apache Commons Lang 的 StringUtils 类提供了一些方便的方法来处理字符串。

java

String[] strArray = StringUtils.splitByCharacterType(str);

第一遍

class Solution {

    public int lengthOfLongestSubstring(String s) {

        char[] chars=s.tocharArray();

        char[] compare=new char(chars.length);

        Arrays.fill(compare,"abc");

        int max=1,flag=1;

        if(chars.length==0)

        return 0;

        for(int i=0;i<chars.length;i++)

        {

            compare[0]=chars[i];

            int j=i+1;

            int temp=1;

            while(flag!=0)

            {

                for(int k=0;k<chars.length;k++)

                {

                    if(compare[k]==chars[j])

                    {

                        if(temp>max)

                        max=temp;

                        break;

                        break;

                    }

                }

                temp++;

                j++;

            }

        }

    }

}

第二遍

class Solution {

    public int lengthOfLongestSubstring(String s) {

        if (s == null || s.length() == 0) {

            return 0;

        }

        int max = 0;

        int start = 0; // 子串的起始索引

        HashMap<Character, Integer> map = new HashMap<>();

        for (int end = 0; end < s.length(); end++) {

            char currentChar = s.charAt(end);

            if (map.containsKey(currentChar)) {

                // 如果字符已存在,移动start到上一次出现的字符的下一个位置

                // 这里使用 Math.max 确保 start 不会向左移动

                //这里的更新位置是看那个字符串存在在hashmap中的位置去更新

                //滑动窗口和kmp算法

                start = Math.max(start, map.get(currentChar) + 1);

            }

            // 更新字符为最新的索引

            map.put(currentChar, end);

            // 更新最长子串的长度

            max = Math.max(max, end - start + 1);

        }

        return max;

    }

}

事实证明还是hashmap的contains好用

然后看二哥的代码是这样的

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int res = 0; // 用于存储最长子串的长度
        for (int i = 0; i < s.length(); i++) {
            boolean[] book = new boolean[256]; // 布尔数组,用于标记字符是否出现过
            
            // 内层循环,从当前字符向前遍历
            for (int j = i; j >= 0; j--) {
                // 如果字符已经在子串中出现过,则结束内层循环
                if (book[s.charAt(j)]) {
                    break;
                }
                // 标记当前字符为已出现过
                book[s.charAt(j)] = true;
                // 更新最长子串的长度
                res = Math.max(res, i - j + 1);
            }
        }
        return res; // 返回最长子串的长度
    }
}

这个代码比较厉害的点在于用boolean的数组标记去作为一个根据
也可以算的上用内存换时间的方法了

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Math.abx(x)
Math.ceil(x)
Math.floor(x)
Math.round(x,y)
Math.min(x,y)
Math.pow(x,y)
Math.sqrt(x)
Math.sin(x)
Math.cos(x)
Math.tan(x)
Math.random()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Xia0Mo

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

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

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

打赏作者

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

抵扣说明:

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

余额充值