文章目录
- [一. 力扣 14. 最长公共前缀](#一. 力扣 14. 最长公共前缀)
-
- [1. 题目](#1. 题目)
- [2. 算法原理](#2. 算法原理)
-
- [(1) 算法一:](#(1) 算法一:)
- [(2) 方法二:](#(2) 方法二:)
- [3. 代码](#3. 代码)
-
- [(1) 方法一代码:](#(1) 方法一代码:)
- [(2) 方法二代码:](#(2) 方法二代码:)
- [二. 力扣 5. 最长回文子串](#二. 力扣 5. 最长回文子串)
-
- [1. 题目](#1. 题目)
- [2. 算法原理](#2. 算法原理)
- [3. 代码](#3. 代码)
- [三. 力扣 67. 二进制求和](#三. 力扣 67. 二进制求和)
-
- [1. 题目](#1. 题目)
- [2. 算法原理](#2. 算法原理)
- [3. 代码](#3. 代码)
- [四. 力扣](#四. 力扣)
-
- [1. 题目](#1. 题目)
- [2. 算法原理](#2. 算法原理)
- [3. 代码](#3. 代码)
一. 力扣 14. 最长公共前缀
1. 题目
2. 算法原理
(1) 算法一:
(2) 方法二:
3. 代码
(1) 方法一代码:
java
public String longestCommonPrefix(String[] strs) {
StringBuilder ret = new StringBuilder();
ret.append(strs[0]);
int j = 0;
for (int i = 1; i < strs.length; i++) {
j = 0;
while (j < ret.length() && j < strs[i].length()) {
if (ret.charAt(j) == strs[i].charAt(j)) {
if (j >= ret.length()) {
ret.append(strs[i].charAt(j));
}
}else {
break;
}
j++;
}
if (j < ret.length()) {
ret.delete(j, ret.length()); // 删除多余不相同的字符
}
}
return ret.toString();
}
(2) 方法二代码:
java
public String longestCommonPrefix(String[] strs) {
int i = 0;
while(i < strs[0].length()) {
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);
}
}
i++;
}
return strs[0];
}

二. 力扣 5. 最长回文子串
1. 题目
2. 算法原理
3. 代码
java
public String longestPalindrome(String s) {
int len = 0;
int start = 0;
int left = 0;
int right = 0;
for (int i = 0; i < s.length(); i++) {
left = i - 1;
right = i + 1;
while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {
left--;
right++;
}
if ((right - left - 1) > len) {
len = right - left - 1;
start = left + 1;
}
left = i;
right = i + 1;
while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {
left--;
right++;
}
if ((right - left - 1) > len) {
len = right - left - 1;
start = left + 1;
}
}
return s.substring(start,start + len);
}

三. 力扣 67. 二进制求和
1. 题目
2. 算法原理
3. 代码
java
public String addBinary(String a, String b) {
int cur1 = a.length() - 1;
int cur2 = b.length() - 1;
char[] ch1 = a.toCharArray();
char[] ch2 = b.toCharArray();
int tmp = 0;
StringBuilder ret = new StringBuilder();
while(cur1 >= 0 || cur2 >= 0 || tmp != 0) {
if (cur1 >= 0) {
tmp += a.charAt(cur1) - '0';
cur1--;
}
if (cur2 >= 0) {
tmp += b.charAt(cur2) - '0';
cur2--;
}
ret.append(tmp % 2);
tmp /= 2;
}
ret.reverse();
return ret.toString();
}

四. 力扣
1. 题目
2. 算法原理
1.大概逻辑,下面是细节讲解
2.为什么tmp长度一定是两个字符串长度和-1
3.无进位相乘再相加的模拟过程
3. 代码
java
public String multiply(String num1, String num2) {
StringBuilder ss1 = new StringBuilder(num1);
ss1.reverse();
String s1 = ss1.toString();
StringBuilder ss2 = new StringBuilder(num2);
ss2.reverse();
String s2 = ss2.toString();
if (s1.equals("0") || s2.equals("0")) {
return "0";
}
int m = num1.length();
int n = num2.length();
int[] tmp = new int[m + n - 1];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
tmp[i + j] += ((s1.charAt(i) - '0') * (s2.charAt(j) - '0'));
}
}
int t = 0;
int i = 0;
StringBuilder ret = new StringBuilder();
while (i < tmp.length || t != 0) {
if (i < m + n - 1) {
t += tmp[i];
}
ret.append(t % 10);
t /= 10;
i++;
}
ret.reverse();
return ret.toString();
}