leetcode Interleaving String

本文探讨了如何判断一个字符串是否可以通过两个给定字符串交错组成。通过深度优先搜索(DFS)和动态规划(DP)两种方法实现,并针对DP方法进行了优化。

Interleaving String

  Total Accepted: 2080  Total Submissions: 12038 My Submissions

Given s1s2s3, find whether s3 is formed by the interleaving of s1 and s2.

For example,
Given:
s1 = "aabcc",
s2 = "dbbca",

When s3 = "aadbbcbcac", return true.
When s3 = "aadbbbaccc", return false.


First, I wrote a DFS program using a stack, however, TLE

class Solution {
 public:
  bool isInterleave(string s1, string s2, string s3) {
    int i = 0, j = 0, k = 0;
    stack<int> s3stack, s2stack;
    if (s1.length() + s2.length() != s3.length())
      return false;
    
    for (k = 0; k < s3.length(); ++k) {
      if (i < s1.length() && s3[k] == s1[i]) {
        if (j < s2.length() && s3[k] == s2[j]) {
          s3stack.push(k);
          s2stack.push(j);
        }
        ++i;
      }
      else {
        if (j < s2.length() && s3[k] == s2[j])
          ++j;
        else {
          if (s3stack.empty())
            return false;
          k = s3stack.top();
          s3stack.pop();
          j = s2stack.top();
          s2stack.pop();
          i = k -j;
          ++j;
        }
      }
    }
    if (i == s1.length() && j == s2.length())
      return true;
    else
      return false;
  }
};

After reading the solution from other people, I wrote a DP program, however, I can't simplify the DP matrix to dp[k][i] though many statuses are redundant.. So the following is the code:

class Solution {
 public:
  bool isInterleave(string s1, string s2, string s3) {
    int i = 0, j = 0, k = 0;
    if (s1.length() + s2.length() != s3.length())
      return false;

    vector<vector<vector<bool>>> dp(s3.length()+1, vector<vector<bool>> (s1.length()+1, vector<bool> (s2.length()+1, false)));
    for (i = 0; i <= s1.length(); ++i)
      for (j = 0; j <=s2.length(); ++j)
        dp[0][i][j] = true;
    int less = s1.length() < s2.length() ? s1.length() : s2.length();    
    for (k = 0; k <= less; ++k)
      dp[k][0][k] = dp[k][k][0] = true;
      
    for (k = 1; k <= s3.length(); ++k) {
      int s1len = s1.length(), s2len = s2.length();
      int start = max(0,k-s2len);
      int end = min(k,s1len);
      for (i = start; i <= end; ++i)
        dp[k][i][k-i] = ((i>=1 && dp[k-1][i-1][k-i] && s3[k-1] == s1[i-1]) || (i<=k-1 && dp[k-1][i][k-i-1] && s3[k-1] == s2[k-i-1])) ? true : false;   
    }
    return dp[s3.length()][s1.length()][s2.length()];
  }
};

I made several mistakes:

1. The boundry: it's different for i>=1 and i <= k-1

2. You'd better use a variable to store s1.length() and s2.length(), the following code is wrong:

int start = (((k-s2.length()) > 0) ? (k-s2.length()) : 0);

but 

      int s2len = s2.length();
      int start = (((k-s2len) > 0) ? (k-s2len) : 0);

is right. 

So don't use s.length() for the operation

3. 

vector<vector<vector<bool>>> dp(s3.length()+1, vector<vector<bool>> (s1.length()+1, vector<bool> (s2.length()+1, false)));


MATLAB代码实现了一个基于多种智能优化算法优化RBF神经网络的回归预测模型,其核心是通过智能优化算法自动寻找最优的RBF扩展参数(spread),以提升预测精度。 1.主要功能 多算法优化RBF网络:使用多种智能优化算法优化RBF神经网络的核心参数spread。 回归预测:对输入特征进行回归预测,适用于连续值输出问题。 性能对比:对比不同优化算法在训练集和测试集上的预测性能,绘制适应度曲线、预测对比图、误差指标柱状图等。 2.算法步骤 数据准备:导入数据,随机打乱,划分训练集和测试集(默认7:3)。 数据归一化:使用mapminmax将输入和输出归一化到[0,1]区间。 标准RBF建模:使用固定spread=100建立基准RBF模型。 智能优化循环: 调用优化算法(从指定文件夹中读取算法文件)优化spread参数。 使用优化后的spread重新训练RBF网络。 评估预测结果,保存性能指标。 结果可视化: 绘制适应度曲线、训练集/测试集预测对比图。 绘制误差指标(MAE、RMSE、MAPE、MBE)柱状图。 十种智能优化算法分别是: GWO:灰狼算法 HBA:蜜獾算法 IAO:改进天鹰优化算法,改进①:Tent混沌映射种群初始化,改进②:自适应权重 MFO:飞蛾扑火算法 MPA:海洋捕食者算法 NGO:北方苍鹰算法 OOA:鱼鹰优化算法 RTH:红尾鹰算法 WOA:鲸鱼算法 ZOA:斑马算法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值