算法—字符串

目录

最长公共前缀

最长回文子串

二进制求和

字符串相乘


最长公共前缀

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

代码:

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;
    }
};
相关推荐
鱼跃鹰飞2 小时前
Leetcode279:完全平方数
数据结构·算法·leetcode·面试
小龙报2 小时前
【数据结构与算法】单链表核心精讲:从概念到实战,吃透指针与动态内存操作
c语言·开发语言·数据结构·c++·人工智能·算法·链表
m5655bj2 小时前
通过 C# 设置 Word 文档背景颜色、背景图
开发语言·c#·word
野犬寒鸦2 小时前
从零起步学习并发编程 || 第二章:多线程与死锁在项目中的应用示例
java·开发语言·数据库·后端·学习
long3162 小时前
合并排序 merge sort
java·数据结构·spring boot·算法·排序算法
一起养小猫2 小时前
Flutter for OpenHarmony 实战:打造功能完整的云笔记应用
网络·笔记·spring·flutter·json·harmonyos
格林威2 小时前
Baumer相机碳纤维布纹方向识别:用于复合材料铺层校验的 5 个核心技巧,附 OpenCV+Halcon 实战代码!
人工智能·数码相机·opencv·算法·计算机视觉·视觉检测
范纹杉想快点毕业2 小时前
STM32单片机与ZYNQ PS端 中断+状态机+FIFO 综合应用实战文档(初学者版)
linux·数据结构·数据库·算法·mongodb
苍何fly2 小时前
全球首个AI原生电商视频Multi-Agent来了, 上传商品链接可一键出营销视频!
人工智能·经验分享