练习一 : 最长公共前缀
方法一 :
java
class Solution {
public String longestCommonPrefix(String[] strs) {
int n = strs.length;
String ret = strs[0];
for(int i = 1;i<n;i++){
ret = findComment(strs[i],ret);
}
return ret;
}
public String findComment(String str1,String str2){
int i = 0;
while(i<Math.min(str1.length(),str2.length())&&str1.charAt(i) == str2.charAt(i)) i++;
return str1.substring(0,i);
}
}
字符串数组看作一条链,依次两两比较,不断缩小公共前缀的范围
方法二 :
java
class Solution {
public String longestCommonPrefix(String[] strs) {
int n = strs.length;
String tmp = strs[0];
for(int i = 0;i<tmp.length();i++){
char s = tmp.charAt(i);
for(int j = 1;j<strs.length;j++){
if(i == strs[j].length()||(strs[j].charAt(i)!=s)){
return tmp.substring(0,i);
}
}
}
return tmp;
}
}
以第一个字符串为基准,逐字符地去对比其他所有字符串。
练习二 : 最长回文子串
java
class Solution {
public String longestPalindrome(String s) {
int begin = 0,len = 0;
int n = s.length();
for(int i = 0;i<n;i++){
//先扩展奇数长度
int left = i,right = i;
while(left>=0&&right<n&&s.charAt(left) == s.charAt(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.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);
}
}
中心扩展算法 , 分别枚举奇数长度以 i 为中心的子串 , 和偶数长度以 i 为中心的子串
练习三 : 二进制求和
java
class Solution {
public String addBinary(String a, String b) {
int cur1 = a.length()-1,cur2 = b.length()-1,t = 0;
StringBuffer s = new StringBuffer();
while(cur1>=0||cur2>=0||t>0){
if(cur1>=0) t+=a.charAt(cur1--)-'0';
if(cur2>=0) t+=b.charAt(cur2--)-'0';
s.append(""+t%2);
t/=2;
}
s.reverse();
return s.toString();
}
}
模拟加法列竖式运算
相加 : 前一位的进位 t+=两数的当前位 , 满 2 进 1 : t%2
进位 : t/=2
从最低位开始拼字符串 , 最低位在字符串的起始位置 , 最终得到的数是逆序的
练习四 : 字符串相乘
java
class Solution {
public String multiply(String num1, String num2) {
num1 = new StringBuilder(num1).reverse().toString();
num2 = new StringBuilder(num2).reverse().toString();
int n1 = num1.length(),n2 = num2.length();
int[]tmp = new int[n1+n2-1];
for(int i = 0;i<n1;i++){
for(int j = 0;j<n2;j++){
int a = num1.charAt(i)-'0';
int b = num2.charAt(j)-'0';
tmp[i+j]+=a*b;
}
}
StringBuffer ret = new StringBuffer();
int index = 0,t = 0;
while(index<tmp.length||t!=0){
if(index<tmp.length) t+=tmp[index++];
ret.append(t%10+"");
t/=10;
}
ret.reverse();
// 处理前导 0
while (ret.length() > 1 && ret.charAt(0) == '0') {
ret.deleteCharAt(0);
}
return ret.toString();
}
}
1.字符串逆转
2.将两个字符串 第 i 位 × 第 j 位 存放在 tmp[] 的 i+j 位 ; 只累加不进位
3.模拟字符串相加
