算法—字符串

目录

最长公共前缀

最长回文子串

二进制求和

字符串相乘


最长公共前缀

**思路:**将所有字符串两两比较即可,先比较第一个和第二个,然后再将得到的公共前缀和第三个字符串进行比较,然后继续得到公共前缀,继续和下一个字符串进行比较。

代码:

cpp 复制代码
class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        string ret = strs[0];
        for(int i = 1; i < strs.size(); i++){
            ret = findCommon(ret, strs[i]);
        }

        return ret;
    }

    string findCommon(string& s1, string& s2){
        int n = min(s1.size(), s2.size());
        int i = 0;
        while(i < n && s1[i] == s2[i])
            i++;

        return s1.substr(0, i);
    }
};

最长回文子串

**思路:**使用中心扩展算法,首先固定一个中心点 i。然后从这个中心点开始,向两边拓展,假设向两边拓展的指针分别名为 left,right,因为最长的回文子串可能是奇数长度也可能是偶数长度,当它是奇数时,起始状态 i == left == right;当它是偶数时,起始状态 i == left,right = left + 1。

代码:

cpp 复制代码
class Solution {
public:
    string longestPalindrome(string s) {
        int n = s.size();
        int begin;
        int len = 0;
        int left, right;
        for(int i = 0; i < n; i++){
            left = right = i;
            while(left >= 0 && right < n && s[left] == s[right]){
                left--;
                right++;
            }
            if(right - left - 1 > len){
                begin = left + 1;
                len = right - left - 1;
            }

            left = i;
            right = i + 1;
            while(left >= 0 && right < n && s[left] == s[right]){
                left--;
                right++;
            }
            if(right - left - 1 > len){
                begin = left + 1;
                len = right - left - 1;
            }
        }

        return s.substr(begin, len);
    }
};

二进制求和

**思路:**定义两个指针分别指向两字符串末尾,定义一个变量存储进位,模拟加法的过程,只要两个字符串还有一个没有遍历完或者进位不为 0,循环就不能停止,因为还有数据需要往结果字符串中添加。需要注意的是,下面代码循环结束后得到的结果字符串不是最终结果,它其实是最终结果反过来了。

代码:

cpp 复制代码
class Solution {
public:
    string addBinary(string a, string b) {
        int i = a.size() - 1;
        int j = b.size() - 1;
        int carry = 0;
        string ret;
        while(i >= 0 || j >= 0 || carry != 0){
            if(i >= 0)
                carry += (a[i] - '0');
            if(j >= 0)
                carry += (b[j] - '0');

            ret += (carry % 2) + '0';
            carry /= 2;
            i--;
            j--;
        } 
        reverse(ret.begin(), ret.end());
        return ret;
    }
};

字符串相乘

**思路:**无进位相乘在相加,最后处理进位。将无进位相乘在相加的结果先存放在一个数组中,方便后面处理进位,将两个字符串反转,每次相乘的两个数的下标加和就是乘积应该存放的位置,处理进位的方式和字符串相加处理进位的方式相同,定义一个变量存放进位,然后遍历数组,将当前遍历的数加到进位中,取模 10 就是要加到结果字符串中的值,除以 10 就是下一轮循环的进位,进位一开始赋值 0。

代码:

cpp 复制代码
class Solution {
public:
    string multiply(string num1, string num2) {
        int m = num1.size();
        int n = num2.size();
        reverse(num1.begin(), num1.end());
        reverse(num2.begin(), num2.end());
        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');
            }
        }

        //处理进位
        int cur = 0;
        int t = 0;
        string ret;
        while(cur < m + n - 1 || t != 0){
            if(cur < m + n - 1)
                t += tmp[cur++];
            ret += t % 10 + '0';
            t /= 10;
        }

        //处理前导零
        while(ret.size() > 1 && ret.back() == '0')
            ret.pop_back();

        reverse(ret.begin(), ret.end());
        return ret;
    }
};
相关推荐
中云DDoS CC防护蔡蔡2 小时前
DDOS和CC攻击谁更可怕
运维·服务器·经验分享·网络安全·ddos
第九序言T3 小时前
Python 数据处理进阶(十八)批量处理同结构文件:一个文件夹一次跑完
开发语言·python·自动化·pandas·数据处理
Sakura_j_h_3 小时前
EasyEDA PCB 快速设计Skills
c++·python·github
上海广测检测科技有限公司4 小时前
蓝牙音箱的 BQB 认证:音频服务层组合、引用链判定与测试状态设定
经验分享
ZhengEnCi4 小时前
Agent 架构怎么选:从单 Agent 到多 Agent 编排的选型决策指南
算法·架构
龙亘川4 小时前
构建城市公共安全数字底座:亘川智城智慧安防系统全维度解读
java·大数据·开发语言·人工智能·信息可视化
程序喵大人4 小时前
【C++入门】内存模型与资源管理 - 09 shared_ptr 和 weak_ptr 解决共享,也带来代价
开发语言·c++·资源管理·智能指针·内存模型
秋天的怀念_David4 小时前
第二十二夜 · 数字迷雾
java·程序人生·算法
Raas1005 小时前
AI网关部署方案?从部署到上线全流程
java·开发语言·人工智能·gateway·ai网关·企业级ai网关·企业级ai产品
Pniubi5 小时前
力扣283移动零(双指针法)
算法·leetcode·职场和发展