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

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int l=1;
        int change=1;
        int r=1;
        char [] q=s.toCharArray();//字符串转换成字符数组
        for(int i=0;i<s.length()-1;i++){
            for(int j=i+1;j<=s.length()-1;j++){
                int m=j-1;
                while(m>=i){
                    if(q[j]!=q[m]){
                        m--;
                        change++;
                    }
                    else {
                        r=0;
                        break;
                    }
                                           
                          }
                if(change>l)
                    l=change;
                
                change=1;
                if(r==0)
                    break;
               
            }
            r=1;
        }
        return l;

    }
}

1.程序中用到的转换知识

//1.字符数组转换成字符串
//(1)直接在构造String时转换
char[] array = new char[] {'a','b','c','d','e','f','g'};        
String str = new String(array);        
System.out.println(str);                
//(2)调用String类的提供的方法的valueOf()        
String str2 = String.valueOf(array);        
System.out.println(str2);                
//2.字符串  转换成 字符数组         
//(1)调用String类的提供的方法的toCharArray()        
String msg = "i am a good boy!";        
char[] dest = msg.toCharArray();        
System.out.println(Arrays.toString(dest));

 2.获取字符串的长度

String s="qwer";
int b=s.length();
//获取字符串中的第j个字符
s.charAt(j)

3.官方题解

滑动窗口
算法
暴力法非常简单,但它太慢了。那么我们该如何优化它呢?
在暴力法中,我们会反复检查一个子字符串是否含有有重复的字符,但这是没有必要的。如果从索引 iii 到 j−1j - 1j−1 之间的子字符串 sijs_{ij}sij​ 已经被检查为没有重复字符。我们只需要检查 s[j]s[j]s[j] 对应的字符是否已经存在于子字符串 sijs_{ij}sij​ 中。
要检查一个字符是否已经在子字符串中,我们可以检查整个子字符串,这将产生一个复杂度为 O(n2)O(n^2)O(n2) 的算法,但我们可以做得更好。
通过使用 HashSet 作为滑动窗口,我们可以用 O(1)O(1)O(1) 的时间来完成对字符是否在当前的子字符串中的检查。
滑动窗口是数组/字符串问题中常用的抽象概念。 窗口通常是在数组/字符串中由开始和结束索引定义的一系列元素的集合,即 [i,j)[i, j)[i,j)(左闭,右开)。而滑动窗口是可以将两个边界向某一方向“滑动”的窗口。例如,我们将 [i,j)[i, j)[i,j) 向右滑动 111 个元素,则它将变为 [i+1,j+1)[i+1, j+1)[i+1,j+1)(左闭,右开)。
回到我们的问题,我们使用 HashSet 将字符存储在当前窗口 [i,j)[i, j)[i,j)(最初 j=ij = ij=i)中。 然后我们向右侧滑动索引 jjj,如果它不在 HashSet 中,我们会继续滑动 jjj。直到 s[j] 已经存在于 HashSet 中。此时,我们找到的没有重复字符的最长子字符串将会以索引 iii 开头。如果我们对所有的 iii 这样做,就可以得到答案。
public class Solution {
    public int lengthOfLongestSubstring(String s) {
        int n = s.length();
        Set<Character> set = new HashSet<>();
        int ans = 0, i = 0, j = 0;
        while (i < n && j < n) {
            // try to extend the range [i, j]
            if (!set.contains(s.charAt(j))){
                set.add(s.charAt(j++));
                ans = Math.max(ans, j - i);
            }
            else {
                set.remove(s.charAt(i++));
            }
        }
        return ans;
    }
}
 
原文地址:https://www.cnblogs.com/manmanchanglu/p/12372752.html