回复: 3
跳转到指定楼层
上一主题 下一主题
收起左侧

zenefits电面 stringmatch正确解法

全局:

2016(4-6月) 码农类General 硕士 全职@zenefits - 内推 - 技术电面  | | Fail | 应届毕业生

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
面试官给我出了道老题, 我用了一亩三分地上的dp解答,挂了;来源如下
1point3acres*com/bbs/thread-145290-2-1*html   (无权限加URL, 请自己把*换成.)
massivealgorithms*blogspot.com/2015/11/zenefits-interview-count-of-possible_28*html   (无权限加URL, 请自己把*换成.)
题目如下:
String s1 = "waeginsapnaabangpisebbasepgnccccapisdnfngaabndlrjngeuiogbbegbuoecccc"
String s2 = "a+b+c-";

s2的形式是一个字母加上一个符号,正号代表有两个前面的字符,负号代表有四个,也就是说s2其实是"aabbcccc",不考虑invalid。
在s1中,找出连续或者不连续的s2,也就是说从s1中找出"aa....bb.....cccc",abc顺序不能变,但是之间可以有零个或多个字符,返回共有多少个。在上面这个例子中,有四个。
结果测试sln.findMatches("aaaaaa", "a+a-") ,出来结果为0,sln.findMatches("aabbaaaa", "a+a-") ,出来结果还为0,不对,挂了

mitbbs上大牛们给出正确解答,包括dp解答,整理如下(麻烦给大米):
1. dp
private String getToken(char c, char op) {
   String s = c + "" + c;
   if (op == '+')
      return s;
   return s + s;
}

private boolean match(String s1, int s1EndIndex, String token) {
   for (int i = token.length() - 1; i >= 0; i--, s1EndIndex--) {
      if (s1EndIndex < 0)
         return false;
            
      if (s1.charAt(s1EndIndex) != token.charAt(i))
         return false;
   }

   return true;
}
   
public int findMatches(String s1, String s2) {
   int s1Len = s1.length();
   int s2Len = s2.length() / 2;
        
   // 'results[i][j]' stores the number of matches of first 'j + 1' tokens
   // from 's2' in sub-string of s1: 's1[0, i]'.
   int[][] results = new int[s1Len][s2Len];
        
   for (int i = 0; i < s1Len; i++) {
      for (int j = 0; j < s2Len; j++) {
         if (i == 0) {
            results[i][j] = 0;
您好!
本帖隐藏的内容需要积分高于 188 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 188 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies
font>

        char character = s2.charAt(0);
        char op = s2.charAt(1);
        String s2Token = getToken(character, op);
        String s2WithoutCurToken = s2.substring(2);
        
        int result = 0;
        
        if (s1.startsWith(s2Token, begin)) {
            result += findMatches(s1, s2WithoutCurToken, begin + s2Token.
length(), cache);
        }
        result += findMatches(s1, s2, begin + 1, cache);
        
        cache.put(cacheKey, result);
        return result;
    }
   
    public int findMatches(String s1, String s2) {
        HashMap<String, Integer> cache = new HashMap<>();
        return findMatches(s1, s2, 0 /*begin*/, cache);
    }


上一篇:fb电面二轮,估计要跪,攒攒人品
下一篇:2/12彭博电面
推荐
 楼主| yi1san3fendi 2016-2-20 08:44:11 | 只看该作者
全局:
JermaineDing 发表于 2016-2-18 05:59
楼主你好,那个recursive方法里面“String cacheKey = s2 + "_" + begin;. ”,为什么给cacheKey加下划线和 ...

我的理解 只是用来产生一个 unique key的,随你
回复

使用道具 举报

🔗
JermaineDing 2016-2-18 05:59:11 | 只看该作者
全局:
楼主你好,那个recursive方法里面“String cacheKey = s2 + "_" + begin;. ”,为什么给cacheKey加下划线和begin?
回复

使用道具 举报

🔗
freetrek 2016-2-25 00:40:22 | 只看该作者
全局:
LZ, py版本的有误, +=p*2 和 += p*4应该是 p[i],不是p
回复

使用道具 举报

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

本版积分规则

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