最短连续包含子串问题java_java – 查找包含String的最短可能子字符串

这是O(N)解决方案.

需要注意的重要事项是:复杂性是每个工作单元都涉及递增开始或结束,它们不会减少,算法在它们结束之前就会停止.

public static String findSubString(String s, String t)

{

//algorithm moves a sliding "current substring" through s

//in this map, we keep track of the number of occurrences of

//each target character there are in the current substring

Map counts = new HashMap<>();

for (char c : t.toCharArray())

{

counts.put(c,new int[1]);

}

//how many target characters are missing from the current substring

//current substring is initially empty, so all of them

int missing = counts.size();

//don't waste my time

if (missing<1)

{

return "";

}

//best substring found

int bestStart = -1, bestEnd = -1;

//current substring

int start=0, end=0;

while (end

{

//expand the current substring at the end

int[] cnt = counts.get(s.charAt(end++));

if (cnt!=null)

{

if (cnt[0]==0)

{

--missing;

}

cnt[0]+=1;

}

//while the current substring is valid, remove characters

//at the start to see if a shorter substring that ends at the

//same place is also valid

while(start

{

//current substring is valid

if (end-start < bestEnd-bestStart || bestEnd<0)

{

bestStart = start;

bestEnd = end;

}

cnt = counts.get(s.charAt(start++));

if (cnt != null)

{

cnt[0]-=1;

if (cnt[0]==0)

{

++missing;

}

}

}

//current substring is no longer valid. we'll add characters

//at the end until we get another valid one

//note that we don't need to add back any start character that

//we just removed, since we already tried the shortest valid string

//that starts at start-1

}

return(bestStart<=bestEnd ? s.substring(bestStart,bestEnd) : null);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值