当前位置: 首页 > news >正文

优选算法的寻踪契合:字符串专题

专栏:算法的魔法世界

个人主页:手握风云

目录

一、例题讲解

1.1. 最长公共前缀

1.2. 最长回文子串

1.3. 二进制求和

1.4. 字符串相乘


一、例题讲解

1.1. 最长公共前缀

        给你一个字符串数组,找出最长公共前缀。

        解法一:两两比较字符串,找出最长公共前缀。利用指针从头开始遍历字符串,如果遇到相同的字符,指针向后移动。当指针越界时,停止。

        完整代码实现:

class Solution {public String longestCommonPrefix(String[] strs) {int len = strs.length;if (strs == null || len == 0) {return "";}if (strs.length == 1) {return strs[0];}// 初始化公共前缀为第一个字符串String prefix = strs[0];// 遍历数组中的其他字符串,依次比较for (int i = 1; i < len; i++) {// 找出当前字符串与prefix的公共前缀prefix = commonPrefix(prefix, strs[i]);// 如果公共前缀为空,提前结束循环if (prefix.isEmpty()) {break;}}return prefix;}public String commonPrefix(String s1, String s2) {int minLen = Math.min(s1.length(), s2.length());int i = 0;while (i < minLen && s1.charAt(i) == s2.charAt(i)) {i++;}return s1.substring(0, i);}
}

        解法二:统一比较。也是利用指针遍历每一个字符串,如果都相同就像后移动,如果不同或者发生越界,停止移动。

        完整代码实现:

class Solution {public String longestCommonPrefix(String[] strs) {int len = strs.length;if (strs == null || len == 0) {return "";}// 遍历第一个字符串的每个字符for (int i = 0; i < strs[0].length(); i++) {char c = strs[0].charAt(i);// 检查其他字符串的相同位置for (int j = 1; j < len; j++) {// 如果其他字符串已经到达末尾,或者字符不匹配,返回当前的前缀if (i >= strs[j].length() || strs[j].charAt(i) != c) {return strs[0].substring(0, i);}}}// 如果第一个字符串是所有字符串的前缀,返回第一个字符串return strs[0];}
}

1.2. 最长回文子串

        本题采用的是中心扩展。定义两个指针left和right,从回文串的中心分别向左右,当遇到不相同的字符或者两个指针越界时停止。要注意:如果子串长度为奇数,left=right;如果子串长度为偶数,right=left+1。

        完整代码实现:

class Solution {public String longestPalindrome(String s) {int n = s.length(), start = 0, end = 0;for (int i = 0; i < n; i++) {// 奇数长度回文串int len1 = expandCenter(s, i, i);// 偶数长度回文串int len2 = expandCenter(s, i, i + 1);int len = Math.max(len1, len2);if (len > end - start) {start = i - (len - 1) / 2;end = i + len / 2;}}return s.substring(start, end + 1);}private int expandCenter(String s, int left, int right) {// 从中心向两边扩展,直到不是回文串while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {left--;right++;}// 返回回文串长度return right - left - 1;}
}

1.3. 二进制求和

        给定两个仅由字符‘0’或‘1’组成的二进制字符串a和b,以二进制字符串的形式返回两数之和。

        本题就是一个模拟手算加法的过程。初始化一个进位carry为 0,结果字符串ret为空。从两个字符串的末尾开始向前遍历,计算当前位上的和,满2向前进1位。遍历结束后,如果还有进位,将进位添加到结果字符串的前面。

        完整代码实现:

class Solution {public String addBinary(String a, String b) {StringBuilder ret = new StringBuilder();int i = a.length() - 1, j = b.length() - 1, carry = 0;// 当至少还有一个字符串未遍历完时,继续循环while (i >= 0 || j >= 0) {int aBit = (i >= 0) ? a.charAt(i--) - '0' : 0;int bBit = (j >= 0) ? b.charAt(j--) - '0' : 0;// 计算当前位的和int sum = aBit + bBit + carry;// 将当前位的结果添加到结果中ret.append(sum % 2);// 更新进位carry = sum / 2;}// 处理最后的进位if (carry > 0) {ret.append(carry);}return ret.reverse().toString();}
}

1.4. 字符串相乘

        给定两个以字符串形式表示的非负整数num1和num2,计算它们的乘积,并将结果以字符串形式返回,不能直接将输入的字符串转换为整数。

        本题考查的是模拟列竖式相乘:利用其中一个字符串的最后一位开始向前遍历,与另一个字符串每一位进行相乘,满10向前进一位,最后相加得到结果。这里需要注意:高位相乘需要在后面补0,为了方便我们可以将字符串num1、num2,最后的返回结果也得逆序;还需要处理前导"0",比如"123"*"0"="0"(清除前面的"0")。

        上面的代码写起来太长,我们可以进行一些优化。我们还是将其中一个字符串的最后一位开始向前遍历,与另一个字符串每一位进行相乘,乘出来的结果不进行进位,最后再相加进位。

        因为乘出来的结果暂时不进位,所以不知道有多少数位,我们可以用一个数组来存储。

        完整代码实现:

class Solution {public String multiply(String num1, String num2) {if (num1.equals("0") || num2.equals("0")) {return "0";}int m = num1.length(), n = num2.length();int[] res = new int[m + n];// 从个位数开始逐位相加for (int i = m - 1; i >= 0; i--) {for (int j = n - 1; j >= 0; j--) {int mul = (num1.charAt(i) - '0') * (num2.charAt(j) - '0');int p1 = i + j; // 高位int p2 = i + j + 1; // 地位int sum = mul + res[p2];res[p2] = sum % 10; // 低位直接赋值res[p1] += sum / 10; // 高位加进位}}// 结果数组转为字符串StringBuffer buffer = new StringBuffer();for (int digit : res) {if (buffer.length() != 0 || digit !=0) {buffer.append(digit);}}return buffer.toString();}
}

http://www.dtcms.com/a/406737.html

相关文章:

  • 光伏运维可视化大屏,解锁管理新方式
  • 环境变量管理于美国服务器多环境部署的实施标准
  • 自己做的网站放在服务器哪里怎么建自己的手机网站吗
  • Efficient Motion-Aware Video MLLM论文阅读
  • 信息化网站建设引言施工企业年终总结及明年工作计划
  • spring项目编译时出现警告需要发行版本9
  • PMP-项目管理-PMBOK第六版_中文版:项目管理标准
  • C语言:自定义类型——联合体和枚举
  • 一文讲清数据指标怎么搭建
  • markdown基础语法及效果演示
  • EC19111304触摸三档定时开关芯片 电容式触控延时开关IC方案SOP-8
  • VideoChat-Flash论文阅读
  • 网站建设功能定位怎么写宜春做网站哪里好
  • 免费建设淘客网站上海网站建设多少费用
  • 数字孪生实施路径揭秘:从数据采集到业务赋能
  • 单片机--usart总线
  • Ansible详解(二)playbook剧本详解
  • 消消乐(双指针)
  • 兰州网站建设推荐q479185700顶上北京营销型网站建站公司
  • KingBaseES V9R1C10数据库安装体验
  • 自动化接口框架搭建分享-pytest第二部分
  • 禹城网站制作贵阳建设职业技术学院招聘信息网站
  • 语义三角论对人工智能自然语言处理深层语义分析的影响与启示
  • 小杰机器学习(nine)——支持向量机
  • 神经网络torch学习路线规划
  • 怎么做自动发卡网站可以自己设计图案的软件
  • 【数据结构】哈希表(Hash Table)详解
  • JVM无法分配内存
  • CCIE网络工程师考哪个方向最好?CCIE选择攻略
  • 网站一般有哪些模块下载天马行市民云app