• 分词问题分析


    题目来源,待字闺中,原创@陈利人 。欢迎大家继续关注微信公众账号“待字闺中”

    给定字符串,以及一个字典。推断字符串能否够拆分为字段中的单词。比如,字段为{hello,world},字符串为hellohelloworld,则能够拆分为hello,hello,world。都是字典中的单词。


    思想:最直接的思路就是递归。我们考虑每个前缀。是否在字典中?假设在,则递归处理剩下的字串;假设不再。则考虑下一个前缀。写成表达式就是fun(i)=substr(i,j-i+1) && fun(j+1),当中i<=j<n-1,且substr(i,j-i+1)在字典中。非常显然,该递归包括非常多反复子问题,所以能够用动态规划,状态转移方程和上面相似。加速的原因是我们仅仅计算一次子问题,即从后向前计算dp[i]=substr(s,j-i+1) && dp[j+1],详细代码例如以下:

    bool dictionaryContain(const set<string>& strset,const string& str)
    {
    	set<string>::iterator iter = strset.find(str);
    	if(iter != strset.end())return true;
    	else return false;
    }
    
    bool wordBreak(const string& str,const set<string>& strset)
    {
    	int length = str.size();
    	bool* dp = new bool[length+1];
    	memset(dp,0,sizeof(bool)*(length+1));
    	dp[length] = true;
    	int i,j;
    	for(i=length-1;i>=0;i--)//从后向前计算dp
    	{
    		for(j=i;j<=length;j++)
    		{
    			if(dictionaryContain(strset,str.substr(i,j-i+1)) && dp[j+1])//状态转移方程
    			{
    				dp[i] = true;
    				break;
    			}
    		}
    	}
    	return dp[0];
    }

    以上仅仅代表个人想法,假设有问题,请指出,谢谢
  • 相关阅读:
    网络记事本第八天
    软件工程第十周总结
    网络记事本第六,七天
    网络记事本开发,第四天
    网络记事本开发第二,三天
    leetcode 198 打家劫舍
    leetcode 46 全排列
    设计模式 之 动态代理
    设计模式 之 静态代理
    设计模式 之 桥接模式
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10829976.html
Copyright © 2020-2023  润新知