leetcode Distinct Subsequences

学到的东西:

  • 应用动态规划
  • c++中multimap的使用
解题思想类似leetcode中的 triangle,创建一个二维数组存储T的每个字符在S中的所有位置,从T的最后一个字符开始初始化这个二维数组,赋值为当前字符向后有多少个序列。

class Solution {
public:
	int numDistinct(string S, string T) {
		if (T.length() > S.length() || T.length() == 0)
			return 0;

		multimap
    
    
     
      Map;
		vector
     
     
      
       *vPosition = new vector
      
      
       
       [T.length()];
		vector
       
       
        
         *vSeq = new vector
        
        
          [T.length()]; int posCount = 0, i; //T中所有字符插入表中 for (i = 0; i < T.length(); i++){ //if (Map.count(T[i]) == 0){ Map.insert(multimap 
         
           ::value_type(T[i], posCount++)); //} } multimap 
          
            ::iterator iter; multimap 
           
             ::size_type count, j; //将S中T的所有字符的位置存入vPosition for (i = 0; i < S.length(); i++){ iter = Map.find(S[i]); count = Map.count(S[i]); for (j = 0; j < count; j++, iter++){ vPosition[iter->second].push_back(i); } } //vSeq最底层设置为1 for (i = 0; i < vPosition[T.length() - 1].size(); i++) vSeq[T.length() - 1].push_back(1); //动态规划从最底层到最顶层,resize默认为0 if (T.length() > 1) { int j, k; for (i = T.length() - 2; i >= 0; i--){ vSeq[i].resize(vPosition[i].size()); for (j = 0; j < vPosition[i].size(); j++){ for (k = 0; k < vPosition[i + 1].size(); k++){ if (vPosition[i][j] < vPosition[i + 1][k]) vSeq[i][j] += vSeq[i + 1][k]; } } } } int result = 0; for (i = 0; i < vSeq[0].size(); i++) result += vSeq[0][i]; return result; } }; 
            
           
          
        
       
       
      
      
     
     
    
    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值