(一).介绍
字符串的算法题目,都是和别的算法结合来去出题的,例如,模拟,高精度加减等等
(二).具体题目
1.最长公共前缀

解法:模拟

java
class Solution {
public String longestCommonPrefix(String[] strs) {
int len=strs.length;
int len0=strs[0].length(); //以第一个字符串的长度为标准
for (int i = 0; i < len0; i++) {
char ch=strs[0].charAt(i); //以第一个字符串的第i个字符为标准
for (int j = 0; j < len; j++) {
if (i==strs[j].length()||strs[j].charAt(i)!=ch){
return strs[0].substring(0,i);
}
}
}
return strs[0];
}
}
2.最长回文子串

解法:中心扩展算法

java
class Solution {
public String longestPalindrome(String s){
int begin=0; //记录开始位置
int len=0; //记录最长回文串的长度
int lenS=s.length();
for (int i = 0; i < lenS; i++) { //固定所有的中间点
//扩展奇数长度的子串
int left=i;
int right=i;
while (left>=0 && right<lenS && s.charAt(left)==s.charAt(right)){
left--;
right++;
}
//取最长长度的回文子串
if (right-left-1>len){ // 当执行到这里的时候,说明 s.charAt(left)和 s.charAt(right) 不相等了,那么相等的部分为 left+1 和 right-1
begin=left+1;
len=right-left-1;
}
//扩展偶数长度的子串
left=i;
right=i+1;
while (left>=0 && right<lenS &&s.charAt(left)==s.charAt(right)){
left--;
right++;
}
if (right-left-1>len){
begin=left+1;
len=right-left-1;
}
}
return s.substring(begin,begin+len);
}
}
3.二进制求和

解法:模拟列竖式计算

java
class Solution {
public String addBinary(String a, String b){
StringBuilder stringBuilder=new StringBuilder();
int cur1=a.length()-1;
int cur2=b.length()-1;
int t=0; //表示进位
while (cur1>=0||cur2>=0){
if (cur1>=0){
int value_A = a.charAt(cur1)-'0';
t+=value_A;
cur1--;
}
if (cur2>=0){
int value_B=b.charAt(cur2)-'0';
t+=value_B;
cur2--;
}
stringBuilder.append(t%2); //由于是逢2进1,所以要%2
t/=2;
}
if (t==1){ //处理特殊情况
stringBuilder.append("1");
}
stringBuilder.reverse(); //由于添加的时候是正着添加的,所以要进行逆序
return stringBuilder.toString();
}
}
4.字符串相乘

解法:模拟

java
class Solution {
public String multiply(String num1, String num2){
//1.优先处理前导零
if ((num1.length()==1&&num1.charAt(0)=='0')||(num2.length()==1&&num2.charAt(0)=='0')){
return "0";
}
//2.进行无进位相加
char[] n1=new StringBuilder(num1).reverse().toString().toCharArray();
char[] n2=new StringBuilder(num2).reverse().toString().toCharArray();
int len1=n1.length;
int len2=n2.length;
int[] temp=new int[len1+len2-1];
for (int i = 0; i < len1; i++) {
int v1=n1[i]-'0';
for (int j = 0; j < len2; j++) {
int v2=n2[j]-'0';
temp[i+j]+=v1*v2;
}
}
//3.处理进位
StringBuilder stringBuilder=new StringBuilder();
int t=0; //表示进位
for (int i = 0; i < temp.length; i++) {
t+=temp[i];
stringBuilder.append(t%10);
t/=10;
}
//4.处理特殊情况
if (t!=0){
stringBuilder.append(t);
}
return stringBuilder.reverse().toString();
}
}