【算法】算法(模拟、指针等)解决字符串类题目(C++)

这篇具有很好参考价值的文章主要介绍了【算法】算法(模拟、指针等)解决字符串类题目(C++)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 前言

字符串题目有很多种,这里筛选几个考察模拟、双指针等的题目,并用相关算法解决。

2. 解决 字符串类算法题

14.最长公共前缀

【算法】算法(模拟、指针等)解决字符串类题目(C++),算法,算法,c++,开发语言

思路

  • 题意分析:题目要求找到字符串数组中的最长公共前缀。
  • 解法一两两比较
    • 遍历数组,每次比较后更新最长公共前缀,并循环比较找最长公共前缀
  • 解法二统一比较
    • 遍历第一个字符串的所有字符,将当前字符与其他字符串相同位置的字符进行比较。
    • 如果发现不匹配的字符或某个字符串已经达到最终长度(即没有更多字符可比较),则返回第一个字符串的前缀子串

代码文章来源地址https://www.toymoban.com/news/detail-792569.html

  • 解法一:
class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        string ret = strs[0];
        // 解法一:两两比较,找公共前缀
        for(int i = 0; i < strs.size(); i++)
        {
            ret = findCommonPrefix(ret, strs[i]);
        }
        return ret;
    }

    string findCommonPrefix(string &s1, string& s2) {
        // 找公共前缀
        string tmp = "";
        for(int i = 0; i < min(s1.size(), s2.size()); ++i)
        {
            if(s1[i] == s2[i])
                tmp += s1[i];
            else
                break;
        }
        return tmp;
    }
};
  • 解法二:
class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        // 解法二:统一比较
        for(int i = 0; i < strs[0].size(); ++i) // 遍历第一个字符串的所有字符
        {
            char tmp = strs[0][i]; // tmp与其他字符比较
            for(int j = 0; j < strs.size(); ++j)
            {
                if(tmp != strs[j][i] || i == strs[j].size()) // 如果字符不匹配or有字符串最终长度截止到当前位置   
                return strs[0].substr(0, i);
            }
        }
        return strs[0];
    }
};

5.最长回文子串

【算法】算法(模拟、指针等)解决字符串类题目(C++),算法,算法,c++,开发语言

思路

【算法】算法(模拟、指针等)解决字符串类题目(C++),算法,算法,c++,开发语言

  • 解法中心扩展算法
    • 如图所示,我们遍历数组,依次固定数组每一位,通过左右两指针找最长回文串。
  • 细节注意
    • 奇数长的回文串与偶数长的回文串计算时,两指针起始位置不同,所以我们分别进行计算。 【算法】算法(模拟、指针等)解决字符串类题目(C++),算法,算法,c++,开发语言

代码

string longestPalindrome(string s) {
    // 遍历每一位,双指针按从左右方向移动,并比较
    int len = 0, n = s.size(), begin = 0; // begin存储最长子串的开始位置
    for(int i = 0; i < n; ++i)
    {
        // 进行奇数长回文串的操作判定
        int left = i, right = i;
        while((left >= 0 && right <= n) && s[left] == s[right]) // 左右指针每次各移一步
            left--, right++;

        if(right - left - 1 > len) // 如果此时回文串长度>len,更新结果
        {
            len = right - left - 1;
            begin = left + 1;
        }

        // 进行偶数长回文串的判定
        left = i, right = i + 1;
        while(left >= 0 && right <= n && s[left] == s[right]) // 左右指针每次各移一步
            left--, right++;

        if(right - left - 1 > len)
        {
            len = right - left - 1;
            begin = left + 1;
        }
    }
    return s.substr(begin, len);
}

67.二进制求和

【算法】算法(模拟、指针等)解决字符串类题目(C++),算法,算法,c++,开发语言

思路

【算法】算法(模拟、指针等)解决字符串类题目(C++),算法,算法,c++,开发语言

  • 解法模拟二进制列式相加的过程
    1. 分别用两指针遍历两字符串,每次用变量carry累加二进制每一位
    2. 后将此次carry加到最终结果中,carry /= 2
    3. 由于字符串ret是逐渐累加结果的,翻转后的字符串才是二进制顺序

代码

string addBinary(string a, string b) {
    int carry = 0; // 记录是否有进位
    int cur1 = a.size()-1, cur2 = b.size()-1;
    string ret = "";
    while(cur1 >= 0 || cur2 >= 0 || carry)
    {
        if(cur1 >= 0) carry += a[cur1--] - '0';
        if(cur2 >= 0) carry += b[cur2--] - '0';

        ret += carry % 2 + '0'; // carry%2即为相加的和
        carry /= 2; // 下一位的进位
    }
    // 由于字符串是逐渐累加结果的,翻转后的字符串才是二进制顺序
    reverse(ret.begin(), ret.end());

    return ret;
}

43.字符串相乘

【算法】算法(模拟、指针等)解决字符串类题目(C++),算法,算法,c++,开发语言

思路

  • 题意分析:要求求出 两个字符串表示的整数 的乘积,且不得使用库函数直接进行整形和字符串的转换。
  • 解法模拟列式相乘的过程
    1. 与上题类似,我们对两字符串首先进行不进位相乘
      • 将输入的两个字符串逆序,从个位开始计算
      • 对应位置上的数字相乘,并将结果存储在临时数组中
      • 后将所有相乘结果相加
    2. 处理进位
      • 定义一个变量carry来记录进位数,然后从数组的第一位开始,将当前位置上的数字与carry相加,得到当前位置上的数字的和,并更新carry为下一位的进位数
      • 将每一位上的结果转换为字符,并添加到结果字符串ret中
      • 去掉结果字符串ret的前导零,并将其逆序,得到最终的结果
        【算法】算法(模拟、指针等)解决字符串类题目(C++),算法,算法,c++,开发语言

代码

string multiply(string num1, string num2) {
    // 解法:模拟列式运算过程
    // 1. 逆序字符串,从个位开始计算
    reverse(num1.begin(), num1.end());
    reverse(num2.begin(), num2.end());
    // 2. 不进位相乘后相加
    int m = num1.size(), n = num2.size();
    vector<int> tmp(m + n - 1);
    for(int i = 0; i < m; ++i)
        for(int j = 0; j < n; ++j)
            tmp[i + j] += (num1[i] - '0') * (num2[j] - '0');

    // 3. 处理进位
    string ret = "";
    int cur = 0, carry = 0;
    while(cur < m + n - 1 || carry)
    {
        if(cur < m + n - 1) carry += tmp[cur++]; // 记录当前位置元素
        ret += (carry % 10) + '0'; // ret加上个位
        carry /= 10; // 下一位的进位数
    }

    cout << ret;
    // 4. 去掉前导0
    while(ret.size() > 1 && ret.back() == '0')
        ret.pop_back();

    reverse(ret.begin(), ret.end());
    return ret;
}

到了这里,关于【算法】算法(模拟、指针等)解决字符串类题目(C++)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【力扣·每日一题】2085.统计出现过一次的公共字符串(模拟 哈希表 优化 C++ Go)

    题目链接 给你两个字符串数组 words1 和 words2 ,请你返回在两个字符串数组中 都恰好出现一次 的字符串的数目。 输入:words1 = [“leetcode”,“is”,“amazing”,“as”,“is”], words2 = [“amazing”,“leetcode”,“is”] 输出:2 解释: “leetcode” 在两个数组中都恰好出现一次,计入答

    2024年01月21日
    浏览(37)
  • 【动态规划】【字符串】C++算法:正则表达式匹配

    视频算法专题 动态规划汇总 字符串 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘ ’ 的正则表达式匹配。 ‘.’ 匹配任意单个字符 \\\' ’ 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。 示例 1: 输入:

    2024年02月03日
    浏览(42)
  • 题目:1967.作为子字符串出现在单词中的字符串数组

    ​ 题目来源:         leetcode题目,网址:1967. 作为子字符串出现在单词中的字符串数目 - 力扣(LeetCode) 解题思路:         遍历字符串数组,根据 word.indexOf(pattern) 的返回值是否为 -1 判断改字符串是否为单词的字符串并对其计数即可。 解题代码: 总结:         官方

    2024年02月13日
    浏览(40)
  • 题目:2609.最长平衡子字符串

    ​​ 题目来源:         leetcode题目,网址:2609. 最长平衡子字符串 - 力扣(LeetCode) 解题思路:        按要求进行模拟即可。 解题代码: 总结:         注意,当 1 的数量小于等于 0 的数量,可以组成一个长度为 1 的数量两倍的平衡字符串。         无官方题解。

    2024年02月12日
    浏览(26)
  • 剑指offer(C++)-JZ48:最长不含重复字符的子字符串(算法-动态规划)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。 数据范围:  s.length≤40000 s.length≤40000 示例: 输入: 返回值: 说明

    2024年02月06日
    浏览(36)
  • LeetCode竞赛题目—在LR字符串中交换相邻字符

    作者: 渴望力量的土狗 博客主页:渴望力量的土狗的博客主页 专栏:每日一道LeetCode 工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器——牛客网 点击免费注册和我一起刷题吧 目录 题目描述:在LR字符串中交换相邻字符 解答思路:双指针法 分析: Java解题

    2024年01月21日
    浏览(41)
  • 剑指offer(C++)-JZ46:把数字翻译成字符串(算法-动态规划)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 有一种将字母编码成数字的方式:\\\'a\\\'-1, \\\'b-2\\\', ... , \\\'z-26\\\'。 现在给一串数字,返回有多少种可能的译码结果 数据范围:字符串长度满足 0n≤90 进阶:空间复杂度

    2024年02月07日
    浏览(34)
  • 题目:2027.转换字符串的最少操作次数

    ​​ 题目来源:         leetcode题目,网址:2027. 转换字符串的最少操作次数 - 力扣(LeetCode) 解题思路:        遍历字符串,如果当前位置字符是 \\\'X\\\',计数加一并将当前元素及其后面的元素变为\\\'0\\\',然后继续遍历字符串。最后返回计数结果即可。 解题代码: 总结:  

    2024年02月16日
    浏览(27)
  • 题目:2185.统计包含给定前缀的字符串

    ​​ 题目来源:         leetcode题目,网址:2185. 统计包含给定前缀的字符串 - 力扣(LeetCode) 解题思路:        遍历判断即可。 解题代码: 总结:         官方题解也是一样的思路。

    2024年02月15日
    浏览(32)
  • C和指针(六)字符串、字符、字节

    字符串 1,C没有显式的字符串类型,以字符串常量形式出现,存储于字符数组中。 2,C字符串是一串以NUL字节结尾的字符。 1)字符内部不能出现NUL字节。 2)NUL字节是字符串的终止符,不是字符串的一部分,所以字符串长度不包括NUL字节。 3,头文件string.h包含了使用字符串

    2024年02月10日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包