IT公司面试题 用网上的dp代码 挂了 请问正确的dp该怎么写

问题描述

IT公司面试题 用网上的dp代码 挂了 请问正确的dp该怎么写

面试官给我出了道老题, 我用了一亩三分地上的dp解答,来源如下
http://www.1point3acres.com/bbs/thread-145290-1-1.html

题目如下:
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,不对,挂了
另外System.out.println(sln.findMatches("waeginsapnaabangpisebbasccepgnccccapisdnfngaabndlrjngeuiogbbegbuoecccc", "a+b+c+c-")); 跑出来是5,感觉正确结果应该是2
不知道用dp正确的解答应该是什么?有人能给出正确的dp代码吗?

以下是从拷贝的测试用例不通过的代码:

 public class Solution {
        public int findMatches(String s1, String s2){
       int len1 = s1.length(), len2 = s2.length();
       if (len2 > len1) return 0;
       if (len2 == 0 || len2 %2 != 0) return 0;
       // DP matches each pattern
       // number of matches between s1.substring(0, i + 1) and s2.substring(j * 2, j * 2 + 2)
       int[][] dp = new int[len1 + 1][len2 / 2 + 1];
       // no match for dp[0][j]
       for (int i = 1; i < len1; i++){
           dp[i + 1][0] = 1;
           for (int j = 0; j < len2 / 2; j++){
               dp[i + 1][j + 1] = dp[i][j + 1];
               if (isMatch(s1, s2, i, j)){
                   if (s2.charAt(2*j + 1) == '+')
                       dp[i + 1][j + 1] += dp[i - 1][j];
                   else
                       dp[i + 1][j + 1] += dp[i - 3][j];
               }
           }
       }
       return dp[len1][len2 / 2];
  }

   boolean isMatch(String s1, String s2, int i, int j){
       char c = s2.charAt(j * 2);
       char p = s2.charAt(j * 2 + 1);
       int len = p == '+' ? 2 : 4;
       if (i - len < -1) return false;
       for (int h = i - len + 1; h <= i; h++){
           if (s1.charAt(h) != c) return false;
       }
       return true;
   }

   public static void main(String[] args){
           Solution sln = new Solution();

           System.out.println(sln.findMatches("waeginsapnaabangpisebbasepgnccccapisdnfngaabndlrjngeuiogbbegbuoecccc", "a+b+c-"));  // 4

           System.out.println(sln.findMatches("waeginsapnaabangpisebbasccepgnccccapisdnfngaabndlrjngeuiogbbegbuoecccc", "a+b+c+c-")); // 5 ???  I think it should be 2
           System.out.println(sln.findMatches("aaaaaa", "a+a-"));//0  wrong!
   }
}

解决方案

拿C#给你写了一个

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string s1 = "waeginsapnaabangpisebbasepgnccccapisdnfngaabndlrjngeuiogbbegbuoecccc";
            string s2 = "a+b+c-";
            List<string> list = new List<string>();
            for (int i = 0; i < s2.Length; i += 2)
            {
                list.Add(new string(s2[i], s2[i + 1] == '+' ? 2 : 4));
            }
            List<List<int>> idx = list.Select(x => new List<int>()).ToList();
            for (int i = 0; i < s1.Length; i++)
            {
                for (int j = 0; j < list.Count; j++)
                {
                    if (i <= s1.Length - list[j].Length && s1.Substring(i, list[j].Length) == list[j])
                    {
                        idx[j].Add(i);
                    }
                }
            }
            List<List<int>> result = idx[0].Select(x => new List<int>() { x }).ToList();
            for (int i = 1; i < idx.Count; i++)
            {
                result = result.SelectMany(x => idx[i].Where(y => y >= x.Last() + list[i - 1].Length).Select(y => x.Concat(new int[] { y }).ToList())).ToList();
            }
            foreach (var item in result) Console.WriteLine(string.Join(",", item));
            Console.WriteLine(result.Count);
        }
    }
}

解决方案二:

太困了,代码不写了,觉得你的思路差不多,先找出所有的单个的匹配(开始的索引)放入数组,然后将它们排列组合,取得递增的组合。

解决方案三:

10,20,28
10,20,64
10,56,64
41,56,64
4
Press any key to continue . . .

解决方案四:

另外System.out.println(sln.findMatches("waeginsapnaabangpisebbasccepgnccccapisdnfngaabndlrjngeuiogbbegbuoecccc", "a+b+c+c-")); 跑出来是5,感觉正确结果应该是2
就是5
(每个数字代表一个匹配的下标)

10,20,24,30
10,20,24,66
10,20,30,66
10,20,31,66
10,20,32,66
5
Press any key to continue . . .

解决方案五:

        string s1 = "aaaaaa";
        string s2 = "a+a-";

输出
0,2
1
Press any key to continue . . .

解决方案六:

竟然不知DP为何物!

解决方案七:

直接用一亩三分地上的dp解答来解答,挂了估计是考官在你之前已经看过你给的答案

时间: 2025-01-30 08:48:41

IT公司面试题 用网上的dp代码 挂了 请问正确的dp该怎么写的相关文章

【试练】某公司面试试题

该公司笔试题就1个,要求在10分钟内作完. 题目如下:用1.2.2.3.4.5这六个数字,写一个main函数,打印出所有不同的排列, 如:512234.412325等,要求:"4"不能在第三位,"3"与"5"不能相连.请问这题怎么做呢?     以前学过全排列的实现方法,但是记不太清,因为数据比较少,我用递归解决了: 答案组合很多,就不一一贴出了     代码: #include<stdio.h> #include<string

成都一家电器公司成为首家网上年检的企业

http://www.aliyun.com/zixun/aggregation/30979.html">华西都市报讯(记者席秦岭实习生鲜菁萱)3月1日,是成都开展2011年度内外资企业年检工作的第一天,也是成都工商启动全程网上年检的第一天.成都一家电器公司成为首家网上年检的企业,从录入信息到公示,全过程不足半小时,且真正实现了企业足不出户就年检的目标. 昨日上午9点59分,某电器公司工作人员将企业的数字证书插入电脑,进入"成都工商网上年检系统"页面,开始申报2011年度

移动支付公司Square将推出网上市场Square Market

&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;   硅谷网讯 据国外媒体报道,移动支付公司Square将推出网上市场Square Market.这将会是该公司首次涉足线上支付,与PayPal展开正面交锋. Square的新举措将允许商家在Square Market网站上开店,展示它们的商品,该公司也将负责处理商品的支付.Square会从每笔商品交易收取2.75%的分成,收费相对较高.亚马逊向第三方在其平台上卖出的

sift-已经用opencv对2副图片进行了SIFT特征点匹配,这一对一对的特征点存储在哪里呢,网上找的代码

问题描述 已经用opencv对2副图片进行了SIFT特征点匹配,这一对一对的特征点存储在哪里呢,网上找的代码 已经用opencv对2副图片进行了SIFT特征点匹配,那么这一对一对的特征点存储在哪里呢,怎么提取其中一对特征点的坐标? #include "stdafx.h" #include #include #include "opencv2/core/core.hpp"//因为在属性中已经配置了opencv等目录,所以把其当成了本地目录一样 #include &qu

jsp java mysql-基于jsp的网上书店系统代码调试

问题描述 基于jsp的网上书店系统代码调试 从网上下载了一个网上书店系统的代码,导入到myeclipse中好多错误,数据库用的是mysql,我只学了一点点jsp的内容,自己不会调,这个系统我急着用,谁能帮我弄一下,可以加我qq帮我远程调一下吗?谢谢了~qq:1096273561 解决方案 你可以把项目发给我么?2970569542@qq.com这个邮箱里面,我帮你看看

二进制-请问 状态压缩dp 中为什么要取模 而且 取 100000000代码如下

问题描述 请问 状态压缩dp 中为什么要取模 而且 取 100000000代码如下 #include<stdio.h>#include<string.h>#include<math.h>#define mod 100000000int nma[15];int dp[13][(1<<12)+10];int check(int xint flag){ int itemp=3; if((a[x]&flag)!=flag)//判断下那一行种是否能够找出fla

求C#做的记事本中替换功能如何实现,网上找的代码都有bug,具体和windows记事本类似

问题描述 求C#做的记事本中替换功能如何实现,网上找的代码都有bug,具体和windows记事本类似 不一定要和windows记事本一模一样,只要没有bug 实现 替换就行 解决方案 reichtextbox.text.replace(oldstring,newsring)就可以了. 解决方案二: 查找会写吧.替换就是查找以后 textBox1..Selection = 你的替换文本 解决方案三: C#字符串替换函数就是replace,就算源代码有错,改改就行

求用java框架写的网上选课系统代码

问题描述 求用java框架写的网上选课系统代码 解决方案 解决方案二: 解决方案三:http://57share.net解决方案四: 解决方案五:给你你看得懂么?给你你用得了么?

网上通用的代码都是点击按钮注销,可是CSDN等网站都是点击超链接注销,可是怎样给超链接写事件代码来释放cookie?

问题描述 网上通用的代码都是点击按钮注销,可是CSDN等网站都是点击超链接注销,可是怎样"给超链接写事件"代码来释放cookie? 解决方案 解决方案二:在LoginOut.aspx的load事件里面写注销的代码.解决方案三:链接到注销页面,注销页面里再处理的~解决方案四:同上解决方案五:原来大家都解决不了,原谅自己了