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

无重复字符的最长子串给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。????分析:滑块思想,最大窗口。快慢指针i,j结合hash。(1)快指针j所在元素不重复,更新max,将快指针j元素在hash表中的标记为出现,后移j(2)快指针j所在元素重复,慢指针后移,此时将慢指针i元素在hash表中的标记清除。此时并不关心是谁重复,重复元素前的元素都要清除掉。代码:class S...
摘要由CSDN通过智能技术生成

无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
在这里插入图片描述
📝分析:
滑块思想,最大窗口。快慢指针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长度相等的并且字符出现次数都相等即为匹配相似。从前往后移动窗口也就是将区域进行后移。直到窗口的右边界超出s2字符串越界结束。在窗口移动的过程中需要将移动过的地方要除去他也就是diff[s2.charAt(i - s1.length()) - ‘a’]–;然后加上新的地方也就是diff[s2.charAt(i) - ‘a’]++;进行移动。
时间复杂度为O(n)。
代码:

class 
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值