12
返回列表 发新帖
楼主: theonecf
跳转到指定楼层
上一主题 下一主题
收起左侧

[高频题] 求指点,亚麻OA题

🔗
Liangyu42087 2020-6-15 21:36:57 | 只看该作者
全局:
非常非常brute force的solution,答案应该是正确的但是timeout了。
整体思路就是先找1个character 再找2个character。。。。一直到n - 1 character (当然找1character的时候碰到"bb"的话需要添加在一起)。

我的方法非常笨,希望有大神能帮忙优化。

  1. public static List<String> findSubstrings(String input) {
  2.         
  3.         List<String> result = new ArrayList<>();
  4.         for (int i = 0; i < input.length() - 1; i++) {
  5.             List<String> temp = helper(input, i);
  6.             if (temp.size() > result.size()) {
  7.                 result = temp;
  8.             }
  9.         }
  10.         if (result.size() == 0) {
  11.             result.add(input);
  12.         }
  13.         
  14.         return result;
  15.     }
  16.    
  17.     private List<String> helper(String input, int num) {
  18.         Map<String, StringBuilder> builderMap = new HashMap<>();
  19.         Map<String, Integer> indexMap = new HashMap<>();
  20.         Set<Character> failedSet = new HashSet<>();
  21.         int right = 0;
  22.         while (right < input.length()) {
  23.             if (right + num > input.length()) {
  24.                 addToFailedSet(failedSet, input.substring(right));
  25.                 break;
  26.             }
  27.             
  28.             String rval = input.substring(right, right + num);
  29.             if (!isValid(failedSet, rval)) {
  30.                 addToFailedSet(failedSet, rval);
  31.             } else {
  32.                 if (!indexMap.containsKey(rval)) {
  33.                     indexMap.put(rval, right);
  34.                     builderMap.put(rval, new StringBuilder());
  35.                     builderMap.get(rval).append(rval);
  36.                 } else {
  37.                     int index = indexMap.get(rval);
  38.                     if (index == right - num) {
  39.                         indexMap.put(rval, right);
  40.                         builderMap.get(rval).append(rval);
  41.                     } else {
  42.                         builderMap.remove(rval);
  43.                         addToFailedSet(failedSet, rval);
  44.                     }
  45.                 }
  46.             }
  47.             right += num;
  48.         }
  49.         
  50.         List<String> result = new ArrayList<>();
  51.         for (String key: builderMap.keySet()) {
  52.             if (isValid(failedSet, key)) {
  53.                 result.add(builderMap.get(key).toString());
  54.             }   
  55.         }
  56.         return result;
  57.     }
  58.    
  59.     private boolean isValid(Set<Character> failedSet, String val) {
  60.         for (int i = 0; i < val.length(); i++) {
  61.             if (failedSet.contains(val.charAt(i))) {
  62.                 return false;
  63.             }
  64.         }
  65.         return true;
  66.     }
  67.    
  68.     private void addToFailedSet(Set<Character> failedSet, String val) {
  69.         for (int i = 0; i < val.length(); i++) {
  70.             failedSet.add(val.charAt(i));
  71.         }
  72.     }
复制代码
回复

使用道具 举报

🔗
tough2016 2020-6-15 22:49:17 | 只看该作者
全局:
同timeout,应该有更快的解法
import java.util.*;

public class Solution {
   
        HashMap<Character ,Integer> map = null;
        public  List<String> findSubstrings(String input) {
            List<String> tmp = new ArrayList<>();
            List<String> res = new ArrayList<>();
            HashSet<Character> set = new HashSet<>();

            HashMap<Character ,Integer> map = new HashMap<>();

            for(int i=0;i<input.length();i++){
                map.put(input.charAt(i),i);
            }
            this.map = map;
            DFS(input,tmp,res,0,set);
            return res;
        }

        private void DFS(String s, List<String> tmp,List<String> res, int index,HashSet<Character> set){
            if(s.length()-index+tmp.size()<res.size()){
                return;
            }

            if(index==s.length()){
                if(res.size()<tmp.size()){
                    res.clear();
                    res.addAll(tmp);

                }else if(res.size()==tmp.size()){
                    if(getLen(res)>getLen(tmp)){
                        res.clear();
                        res.addAll(tmp);
                    }
                }
                return;
            }

            if(set.contains(s.charAt(index))){
                DFS(s,tmp,res,index+1,set);
                return;
            }
            Character x = s.charAt(index);

            int y = findNext(x,s,index,set);
            if(y!=-1){
                String tmpp = s.substring(index,y+1);
                tmp.add(s.substring(index,y+1));

                DFS(s,tmp,res,y+1,set);

                tmp.remove(tmp.size()-1);
            }

            set.add(x);
            DFS(s,tmp,res,index+1,set);
            set.remove(x);
        }

        int findNext(Character x,String s,int i,HashSet<Character> set){
            int res = i;
            int xx = map.get(x);
            while(res<s.length()&&res<xx){
                if(set.contains(s.charAt(res))){
                    res = -1;
                    break;
                }
                xx  = Math.max(xx, map.get(s.charAt(res)));
                res ++;
            }
            return res;
        }


        int getLen(List<String> res){
            int x = 0;
            for(int i=0;i<res.size();i++){
                x += res.get(i).length();
            }
            return x;
        }

   
}
回复

使用道具 举报

🔗
wbxzhr123 2020-6-16 00:58:46 | 只看该作者
全局:
xenway 发表于 2020-6-15 19:32
是不是条件2的限制?

是,那个条件我就看不太懂。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表