第四天

无重复字符的最长子串

  • 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

  • 输入: s = "abcabcbb"
  • 输出: 3
  • 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
class Solution {
    public int lengthOfLongestSubstring(String s) {
         Set<Character> occ = new HashSet<Character>();
         int answer=0;
         int rightFrontier=-1;
         for(int i = 0; i<s.length(); i++){
             if(i!=0){//第一次,不需要删除窗口最左的位置
                 occ.remove(s.charAt(i-1));
             }
             while(rightFrontier<s.length()-1&&!occ.contains(s.charAt(rightFrontier+1))){
                 rightFrontier++;
                 occ.add(s.charAt(rightFrontier));//每次将所有的不重复串遍历结束
             }

            answer = Math.max(rightFrontier-i+1,answer);//保留最大值
         }
         return answer;
    }
}

最长回文子串

  • 给你一个字符串 s,找到 s 中最长的回文子串。

  • 示例 1:
    输入:s = "babad"
    输出:"bab"
    解释:"aba" 同样是符合题意的答案。

  • 遇到困难以及点评
    对动归理解不透彻,不能及时想到。建议二刷

  • 代码

class Solution {
    public String longestPalindrome(String s) {

        boolean[][] table = new boolean[s.length()][s.length()];
        String result = "";
        
        //遍历1
        for(int i=0;i<table.length;i++){
            table[i][i] = true;
            result = s.substring(i, i+1);
        }

        //遍历2
        for(int i = 0;i<table.length-1;i++){
            if(s.charAt(i)==s.charAt(i+1)){
                table[i][i+1] = true;
                result = s.substring(i, i + 2);
            }else{
                table[i][i+1] = false;
            }
            result = s.substring(i, i+1);
        }



        // length > 2;
        for (int len = 2; len < table.length; len++) {
            for (int i = 0; i + len < table.length; i++) {
                char front = s.charAt(i);
                char end = s.charAt(i + len);
                if (front == end) {
                    table[i][i + len] = table[i + 1][i + len - 1];
                } else {
                    table[i][i + len] = false;
                }
                if(table[i][i + len]){
                    result = s.substring(i, i + len+1);//左闭右开
                }
            }
        }
        return result;
    }
}

Java 小知识

1.画出代码的内容结构

String s1 = "hello";
String s2 = "hello";
String s3 = new String("hello");
s1 += "world";

image

2.如何理解String 不可变性

  • 对数据修改均要在堆空间新造

3.String 是否可被继承

  • 不可,因为声明为final

4.String StringBuffer StringBuilder 三者对比

1>String 具有不可变性,后两个均可变
2>StringBuffer线程安全,效率比StringBuilder稍稍低,但是比String要高
3>底层存储结构都是char[]

5.String 常用方法

length()/charAt()/equals()/startsWith()/endsWith()
contains()/indexOf()

6.String 转换 StringBuffer StringBuilder

String->StringBuffer StringBuilder()两个差不多

1.构造器

String s="Hello";
StringBuffer str=new StringBuffer(s);

2.append

 String s="Hello";
 StringBuffer str=new StringBuffer();
 str.append(s)
StringBuffer StringBuilder()两个差不多->String

1.构造器

StringBuffer str=new StringBuffer("java");
String s=new String(str); 

2.toString方法

StringBuffer str=new StringBuffer("java");
String s=str.toString();
posted @ 2021-07-01 22:01  Simon1010  阅读(31)  评论(0编辑  收藏  举报