无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
📝分析:
滑块思想,最大窗口。快慢指针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长度相等的并且字符出现次数都相等即为匹配相似。从