BM67 不同路径的数目(一)

该博客讨论了一个机器人在m×n大小的地图上从左上角到右下角的不同路径数量的问题。通过使用动态规划的方法,实现了空间复杂度为O(nm)和时间复杂度为O(nm)的解决方案。进阶目标是降低空间复杂度到O(1)并保持时间复杂度在O(min(n,m))。示例展示了对于不同输入尺寸的输出结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

描述

一个机器人在m×n大小的地图的左上角(起点)。
机器人每次可以向下或向右移动。机器人要到达地图的右下角(终点)。
请添加图片描述
可以有多少种不同的路径从起点走到终点?
备注:m和n小于等于100,并保证计算结果在int范围内
数据范围:0<n,m≤100,保证计算结果在32位整型范围内
要求:空间复杂度 O(nm),时间复杂度 O(nm)
进阶:空间复杂度 O(1),时间复杂度 O(min(n,m))

示例1
输入:2,1
返回值:1

示例2
输入:2,2
返回值:2

代码

class Solution {
public:
    /**
     * 
     * @param m int整型 
     * @param n int整型 
     * @return int整型
     */
    int uniquePaths(int m, int n) {
        // write code here
        vector<vector<int>> dp(m+1,vector<int>(n+1,0));
        for(int i=1;i<=m;i++){
            for(int j=1;j<=n;j++){
                if(i==1 && j==1) dp[i][j]=1;
                else dp[i][j]=dp[i-1][j]+dp[i][j-1];
            }
        }
        return dp[m][n];
    }
};
BM (Boyer-Moore) 算法种用于字符串搜索的经典字符串匹配算法,它利用了坏字符规则(Bad Character Rule)和好后缀规则(Good Suffix Rule)。虽然C语言并不像Python那样有内置的字符串操作函数,但我们仍可以手动实现基本功能。 ```c #include <stdio.h> #include <string.h> #define INDEXNotFound -1 // 坏字符规则 int badCharShift(char target, char pattern[]) { for (int i = 0; pattern[i] != '\0'; i++) { if (pattern[i] == target) return i; } return INDEXNotFound; } // 好后缀规则 int goodSuffixShift(int j, char pattern[], char text[]) { while (j >= 0 && text[j] == pattern[j]) { j--; } return j + 1; } // BM算法核心函数 int boyerMooreSearch(char text[], char pattern[]) { int lenText = strlen(text); int lenPattern = strlen(pattern); // 使用滚动数组简化计算 int shift[256]; // 初始化所有字符的badCharShift值 memset(shift, INDEXNotFound, sizeof(shift)); for (int i = 0; i < lenPattern; i++) { shift[pattern[i]] = i; } int i = lenText - lenPattern; // 搜索起始位置从后往前推 while (i >= 0) { // 检查每个字符是否匹配 for (int j = lenPattern - 1; j >= 0; j--) { if (text[i + j] != pattern[j]) { int badChar = badCharShift(text[i + j], pattern); int suffixShift = goodSuffixShift(j, pattern, text); if (badChar != INDEXNotFound) { i += max(badChar, suffixShift); // 取两者较大的值 } else { // 如果没有找到坏字符,则尝试好后缀规则 i += suffixShift; break; } break; } } if (j == -1) { // 找到了完全匹配,返回索引 return i; } } return INDEXNotFound; // 如果没有找到匹配,返回未找到标记 } int main() { char text[] = "Hello, World!"; char pattern[] = "World"; int index = boyerMooreSearch(text, pattern); if (index != INDEXNotFound) { printf("Pattern found at position %d\n", index); } else { printf("Pattern not found\n"); } return 0; } ``` 以上就是C语言版的BM算法基本实现。这个程序会查找文本`text`中是否有给定的模式`pattern`。运行`main()`函数可以看到结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Pmetpord丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值