1、给你一个字符串 S,找出所有长度为 K 且包含重复字符的子串,请你返回全部满足要求的子串的数目。
思路:利用两个指针维护k长度的串,用map记录串中出现的字符,用set记录当前k长度的串中重复的字符,两个指针同步移动时候注意右边指针字符的加入检查和左边移除的字符检查,检查当前k长度字符串是否重复字符条件就是set中是否有元素。
代码:
import java.util.*;
public class Solution {
public int numKLenSubstrRepeats (String s, int k) {
int len=s.length();
if(len maps=new HashMap<>();
Set set=new HashSet<>();
while(right1){
set.add(rc);
}
if(set.size()>0) ans++;
}
return ans;
}
}
2、给定一个可包含重复数字的序列 nums ,按序列内字典升序返回所有不重复的全排列。
其中序列内字典升序指的是, 序列内从左到右的非降序排列,例如 nums=[1,2,3], 则因为[1,2,3] < [1,3,2], [3,1,2] < [3,2,1], [1,2,3]要先于[1,3,2]输出,[3,1,2]要先于[3,2,1]输出。
dfs全排列即可,用vis数组标记每个位置的数是否被用过,用hashset去重,treeset排序,但是这个treeset排序有问题,导致最终没能全a。
import java.util.*;
public class Solution {
public int[][] UniquePerm (int[] nums) {
Set> sets=new TreeSet<>(new Comparator>() {
@Override
public int compare(List list1, List list2) {
for(int i=0;ilist2.get(i)) return 1;
}
return 0;
}
});
boolean vis[]=new boolean[nums.length];
for(int i=0;i());
int ans[][]=new int[sets.size()][nums.length];
int cnt=-1;
for(List list:sets){
cnt++;
for(int i=0;i> sets,List list){
if(list.size()==nums.length){
List tempList=new ArrayList<>(list);
sets.add(tempList);
return;
}
for(int i=0;i
3、将两个降序链表合并为一个新的 降序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
import java.util.*;
public class Solution {
public ListNode MergeTwoLists (ListNode list1, ListNode list2) {
ListNode res=new ListNode(0);
ListNode p=res;
while(list1!=null&&list2!=null){
if(list1.val>=list2.val){
p.next=new ListNode(list1.val);
list1=list1.next;
}else{
p.next=new ListNode(list2.val);
list2=list2.next;
}
p=p.next;
}
while(list1!=null){
p.next=new ListNode(list1.val);
list1=list1.next;
p=p.next;
}
while(list2!=null){
p.next=new ListNode(list2.val);
list2=list2.next;
p=p.next;
}
return res.next;
}
}



