首页 > 编程语言 >【算法】【优选算法】字符串

【算法】【优选算法】字符串

时间:2024-12-08 14:30:59浏览次数:5  
标签:优选 String int length ret 算法 right 字符串

目录


一、14.最⻓公共前缀

题目链接:14.最⻓公共前缀
题目描述:

解题思路:

  • 思路一:
    • 我们直接两两求一下公共前缀,记录在ret字符串中,然后ret与后续继续求公共前缀,最后的ret就是结果
    • 求公共前缀,我们就求一下在字符串中的公共前缀的最后一个字符 的下一个下标即可。
  • 思路二:
    • 我们就将第一个字符串作为基准,遍历字符串,每个字符再与字符串数组中剩下的字符串,对应下标的字符比较即可。
    • 当超出某个字符串长度或者字符不同了,就可以返回了。
    • 最后第一个字符串都遍历完了,还没找到,那么第一个字符串就是结果。

解题代码:

思路一:
//时间复杂度:O(m*n)
//空间复杂度:O(1)
class Solution {
    public String longestCommonPrefix(String[] strs) {
        //两两比较
        String ret = strs[0];
        for(int i = 1; i < strs.length; i++) {
            ret = commonPrefix(ret, strs[i]);
        }
        return ret;
    }
    //返回两个字符串的公共前缀
    public String commonPrefix(String s1, String s2) {
        int last = 0;
        while(last < s2.length() && last < s1.length() && s2.charAt(last) == s1.charAt(last)) last++;
        return s1.substring(0,last);
    }
}
思路一:
//时间复杂度:O(m*n)
//空间复杂度:O(1)
class Solution {
    public String longestCommonPrefix(String[] strs) {
        //一起比较
        for(int i = 0; i < strs[0].length(); i++) {
            char ch  = strs[0].charAt(i);
            for(int j = 1; j < strs.length; j++) {
                if(i >= strs[j].length() || ch != strs[j].charAt(i))
                    return strs[0].substring(0,i);
            }
        }
        return strs[0];
    }
}

二、5.最⻓回⽂⼦串

题目链接:5.最⻓回⽂⼦串
题目描述

解题思路:

  • 中⼼扩散:从回⽂串的中⼼开始,往左读和往右读。从中⼼向两边扩展,如果两边的字⺟相同,我们就可以继续扩展;如果不同,我们就停⽌扩展。
  • 我们还需要将回文子串的长度是奇数和偶数都要考虑。

解题代码:

//时间复杂度:O(n^2)
//空间复杂度:O(1)
class Solution {
    public String longestPalindrome(String s) {
        String ret = "";
        for(int i = 0; i < s.length(); i++) {
            //奇数长度
            int left = i;
            int right = i;
            while(left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {
                left--;
                right++;
            }
            if(right - left - 1 > ret.length()) ret = s.substring(left+1, right);

            //偶数长度
            left = i;
            right = i+1;
            while(left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {
                left--;
                right++;
            }
            if(right - left - 1 > ret.length()) ret = s.substring(left+1, right);
        }
        return ret;
    }
}

三、67.⼆进制求和

题目链接:67.⼆进制求和
题目描述:

题目解析:

解题思路:

  • 模拟竖式加法过程,从后向前遍历两个字符串,
  • 定义一个变量,将对应位的相加,和对2取余就是结果对应位的数字,考虑进位就是除以2
  • 当两个字符串都遍历结束,并且变量为0,就得到了结果逆序后的字符串了
  • 最后逆序返回就可以

解题代码:

//时间复杂度:O(n)
//空间复杂度:O(1)
class Solution {
    public String addBinary(String a, String b) {
        StringBuffer ret = new StringBuffer();
        int cruA = a.length() - 1;
        int cruB= b.length() - 1;
        int tmp = 0;
        while(cruA >= 0 || cruB >= 0 || tmp != 0) {
            if(cruA >= 0) tmp += a.charAt(cruA--) - '0';
            if(cruB >= 0) tmp += b.charAt(cruB--) - '0';
            ret.append((char)(tmp % 2 + '0'));
            tmp /= 2; 
        }
        return ret.reverse().toString();
    }
}

四、43.字符串相乘

题目链接:43.字符串相乘
题目描述:

题目解析:

  • 就相当于每个字符串就是一个数,让我们求乘积,乘积也放在字符串中。

解题思路:

  • 还是使用小学的竖式运算规则,
  • 但是有所不同的是,我们先不进位(就是如果3*8=24,先不进2),在最后的结果中来进位。
  • 我们竖式计算过程是从末尾先开始的,所以我们先将两个字符串逆序。
  • 通过竖式计算过程,每个位计算结果在结果中的下标就是原来两个字符串的下标之和
  • 在进位的时候,我们只需要将每位数字 ,除以10的结果记录在一个变量中,然后这个变量就是进位的数。
  • 现在得到的结果还可能会有前导零:前导零就是指152 * 0 = 000 这就有两个前导零。
  • 由于现在的结果是逆序的,所以从最后开始检验,有就删,注意极端情况全为0的时候,还要保留一位。

解题代码:

//时间复杂度:O(n)
//空间复杂度:O(n)
class Solution {
    public String multiply(String num1, String num2) {
        int[] arr = new int[num1.length() + num2.length()-1];

        //逆序
        char[] n1 = new StringBuffer(num1).reverse().toString().toCharArray();
        char[] n2 = new StringBuffer(num2).reverse().toString().toCharArray();


        //无进位相乘,相加
        for(int i = 0; i < n1.length; i++) {
            for(int j = 0; j < n2.length; j++) {
                arr[i+j] += (n1[i] - '0') * (n2[j] - '0'); 
            }
        }
        // 进位
        int tmp = 0;
        int cur = 0;
        StringBuffer ret = new StringBuffer();
        while(cur < arr.length || tmp > 0) {
            if(cur < arr.length) tmp += arr[cur++];
            ret.append((char)(tmp % 10 + '0'));
            tmp /= 10;
        }
        //处理前导零
        while(ret.length() > 1 && ret.charAt(ret.length() - 1) == '0') ret.deleteCharAt(ret.length() - 1);

        return ret.reverse().toString();
    }
}

标签:优选,String,int,length,ret,算法,right,字符串
From: https://blog.csdn.net/yj20040627/article/details/144065107

相关文章

  • [待更新]欧几里得算法(辗转相除法)与拓展欧几里得算法
    更新日志2024/12/08:开工。欧几里得算法用途与原理欧几里得算法,用于求两个数的最大公约数。其核心原理为:\(\gcd(a,b)=\gcd(b,a\bmodb)\)证明首先,我们证明\(\gcd(a,b)=\gcd(b,a\bmodb)\)。为了方便证明,这里我们令\(a>b\)。\[\because\gcd(a,b)\mida\text,\gcd......
  • 【C++算法】33.位运算_判定字符是否唯一
    文章目录题目链接:题目描述:解法C++算法代码:图解题目链接:面试题01.01.判定字符是否唯一题目描述:解法如果使用数据结构的话哈希表:一个一个字符扫描,不在哈希表里面的就放进去,在里面的就返回false。扫描完全部不重复就返回true。也可以优化一下,字母一共26......
  • 【C++算法】34.位运算_丢失的数字
    文章目录题目链接:题目描述:解法C++算法代码:题目链接:268.丢失的数字题目描述:解法哈希表创建一个0~5的数组从前往后遍历一下,有的数字就在表里面标记一下,最后看一下哪些数字没有被标记过。高斯求和先求出应该有的和:(首项+末项)*项数÷2然后减去数组的和......
  • 机器学习(4)Kmeans算法
    1、简述聚类分析的重要性及其在机器学习中的应用  聚类分析,作为机器学习领域中的一种无监督学习方法,在数据探索与知识发现过程中扮演着举足轻重的角色。它能够在没有先验知识或标签信息的情况下,通过挖掘数据中的内在结构和规律,将数据对象自动划分为多个类别或簇。每个簇内的......
  • 字符串替换pta(C语言)
    本题要求编写程序,将给定字符串中的大写英文字母按以下对应规则替换:原字母对应字母AZBYCXDW……XCYBZA输入格式:输入在一行中给出一个不超过80个字符、并以回车结束的字符串。输出格式:输出在一行中给出替换完成后的字符串。输入样例:Onlythe11CAPItaLLeTtERSarerepla......
  • 算法日记 43-44 day 图论(深搜,广搜)
    直接看题目,还是熟悉写法。题目:孤岛的总面积101.孤岛的总面积(kamacoder.com)题目描述给定一个由1(陆地)和0(水)组成的矩阵,岛屿指的是由水平或垂直方向上相邻的陆地单元格组成的区域,且完全被水域单元格包围。孤岛是那些位于矩阵内部、所有单元格都不接触边缘的岛屿。现在......
  • 地平线 bev 参考算法板端一致性验证教程
    01前言由于部署时数据来源的硬件不同以及应用开发的高效性要求,往往会使得在板端部署阶段的数据准备操作与训练时有所差异,导致在同样的输入下,量化模型的输出结果和板端部署模型的输出结果不一致。本文将基于开发者社区中已经发布的地平线bev参考算法板端输入数据准备教程,以be......
  • 【推荐算法】推荐系统中的单目标精排模型
    前言:推荐系统中模型发展较快,初学者【也就是笔者】很难对模型进行一个系统的学习。因此,这篇文章总结了王树森中的视频以及《深度学习推荐系统》中的单目标精排模型,绘制了一个单目标精排模型的思维导图来帮助初学者【笔者】更好的学习。在后面的学习过程中,会加入更多的单目标......
  • 学习王宏志老师《大数据算法》PPT
    哈尔滨工业大学王宏志老师《大数据算法》                                                        ......
  • 最小栈算法
    介绍        最小栈,即具有栈的基本功能,同时可以用O(1)的时间复杂度取出栈中最小值题目链接:155.最小栈-力扣(LeetCode)设计一个支持push,pop,top操作,并能在O(1)时间内检索到最小元素的栈。实现MinStack类:MinStack()初始化堆栈对象。voidpush(intval)......