Bootstrap

字节跳动编程题(挑战字符串)

无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
在这里插入图片描述
📝分析:
滑块思想,最大窗口。快慢指针i,j结合hash。
(1)快指针j所在元素不重复,更新max,将快指针j元素在hash表中的标记为出现,后移j
(2)快指针j所在元素重复,慢指针后移,此时将慢指针i元素在hash表中的标记清除。此时并不关心是谁重复,重复元素前的元素都要清除掉。
代码:

class Solution {
   
    public int lengthOfLongestSubstring(String s) {
   
        int []hash = new int [500];
        int max = 0;
        int i = 0, j = 0;

        while (i < s.length() && j <s.length() ) {
   
            if(hash[s.charAt(j)] == 0) {
   
                hash[s.charAt(j)] = 1;
                j++;
                max = (j - i) > max ? (j - i) : max;
            } else {
   
                hash[s.charAt(i)] = 0;
                i++;
            }  
        }
        return max; 
    }
}

最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。

在这里插入图片描述
代码:

class Solution {
   
    public String longestCommonPrefix(String[] strs) {
   
        String s="";
        int judge=1;
        if(strs.length==0){
   //数组为空直接返回""
            return s;
        }
        for(int i=0;i<strs[0].length();i++){
   
            char a=strs[0].charAt(i);//直接选择第一个数组元素,依次取这个字符串的字符
            
            for(int j=0;j<strs.length;j++){
   
                
                if(i>=strs[j].length()){
   //因为每个字符串长度不同,防止溢出
                    judge=0;
                    break;
                }
                
                if(a!=strs[j].charAt(i)){
   
                    judge=0;//只要存在不同,直接退出
                    break;
                }
                
                else{
   
                    if(j==strs.length-1){
   
                        s=s+a;
                    }
                }
                
            }
            if(judge==0){
   
                break;
            }
        }
    
        return s;
    }
}

字符串的排列

给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列。
换句话说,第一个字符串的排列之一是第二个字符串的子串。

在这里插入图片描述
📝分析:
这是一个变形后的滑动窗口问题,我们窗口的大小就按照的是s1的长度,将s2向后移动进行匹配,如果相同也就是在窗口中s2中的字符和s1长度相等的并且字符出现次数都相等即为匹配相似。从

;