题目链接:2904. 最短且字典序最小的美丽子字符串(中等)
算法原理:
解法:滑动窗口
击败81.74%
时间复杂度O(N)
①先判断是否有解,无解直接返回空串
②进窗口:计数器++
③出窗口:尽可能缩小长度,因为前面是'0'也要缩小长度,所以先出窗口
④更新:对比要返回的字符串和当前的字符串,如果当前字符串长度小,直接更新,或者长度相同时字典序更小,再更新
Java代码:
java
class Solution {
public String shortestBeautifulSubstring(String ss, int k) {
//先统计1的个数,无解直接返回空串
int one=0;
char[] s=ss.toCharArray();
for(char c:s) if(c=='1') one++;
if(one<k) return "";
int n=s.length,count=0;
int len=n;
String ret=ss;
for(int right=0,left=0;right<n;right++){
//进窗口
if(s[right]=='1') count++;
//出窗口
while(count>k||s[left]=='0')
if(s[left++]=='1') count--;
//更新
if(count==k){
//[left,right+1)->[left,right]
String t=ss.substring(left,right+1);
//长度更小或者字典序更小就更新
if(t.length()<ret.length()||t.length()==ret.length()&&t.compareTo(ret)<0)
ret=t;
}
}
return ret;
}
}