前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >给定一个字符串,找到包含该字符串所有字符的最短子串

给定一个字符串,找到包含该字符串所有字符的最短子串

作者头像
jiewuyou
发布2022-09-29 15:17:56
5710
发布2022-09-29 15:17:56
举报
文章被收录于专栏:数据人生

这题是豌豆荚二面的一个算法题,和leetcode的某些题目类似。其思路是这样的

  1. 首先遍历一次字符串,求出字符串不同字符的数目
  2. 为每一个字符保存一个列表,记录该字符在字符串中出现的索引
  3. 记录待求字符串的首字母的索引start(初始值为0),结束索引end(初始值为length-1)
  4. 记录可能的待求字符串的首字母的索引值为pStart(初始值为0)
  5. 重新遍历字符串,当前索引为index
    1. 更新没有遍历的字符的数目,更新当前字符对应的索引列表。如果pStart处字符对应的列表长度大于1,则从索引列表中移出pStart,并将pStart加1,并重复该过程
    2. 如果index处字符是第一次出现,则将剩余字符数目减一
    3. 如果剩余字符数目为0时,且子字符串[pStart:index]比[start:end]短,则更新[start:end]为[pStart:index]
  6. 返回子字符串[start:end 你会发现[start:end]为待求字符串。可以在纸上画画看
代码语言:javascript
复制
class Solution {
  String getShortestSubString(String str) {
    if (str == null || str.length() <= 1) {
      return str;
    }
    // 记录目标字符串的起始索引
    int start = 0, end = str.length() - 1;
    // 记录目标字符串的开始位置
    int pStart = 0;
    Map<Character, List<Integer>> map = new HashMap<Character, List<Integer>>();
    for (int index = 0; index < str.length(); index++) {
      map.put(str.charAt(index), null);
    }
    int remainingCharacter = map.keySet().size();
    for (int i = 0; i < str.length(); i++) {
      char c = str.charAt(i);
      if (map.get(c) == null) {
        List list = new LinkedList<Integer>();
        map.put(c, list);
        remainingCharacter--;
      }
      map.get(c).add(i);
      while (map.get(str.charAt(pStart)).size() > 1) {
        map.get(str.charAt(pStart)).remove(0);
        pStart++;
      }
      if (remainingCharacter == 0) {
        if (i - pStart < end - start) {

          start = pStart;
          end = i;
        }
      }
    }
    return str.substring(start, end + 1);
  }
}
class TestSolution {
  @Test
  public void testGetShortestSubString() {
    Solution solution = new Solution();
    Assert.assertEquals("dbccaaabcefg", solution.getShortestSubString("abcddbccaaabcefggf"));
  }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-04-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档