leetcode 3 无重复字符的最长子串
class Solution {public int lengthOfLongestSubstring(String s) {// map记录字符串中字符和它出现的下标Map<Character, Integer> map = new HashMap<>();// 字符串长度int len = s.length();// 标记int left = 0;int right = 0;// 最终返回结果int res = 0;for(;right<len;right++){// 当出现过某个字符时,进入ifif(map.containsKey(s.charAt(right))){// 更新结果res = Math.max(right-left, res);// 更新左边界,⭕其中max方法是本题关键,避免"abba"这种示例left = Math.max(map.get(s.charAt(right))+1,left);}map.put(s.charAt(right),right);}res = Math.max(res, right-left);return res;}}
leetcode 6 Z字形变换
// v1.0 用二维数组存放字符串数据class Solution {public String convert(String s, int numRows) {if(numRows==1){return s;}int len = s.length();Character[][] table = new Character[numRows][len];int row = 0, column = 0, size = 0;boolean down = true;while(size<len){table[row][column] = s.charAt(size);if(down){row++;}else{row--;column++;}if(row==0){down = true;}else if(row == numRows-1){down = false;}size++;}String res = "";for(int i=0;i<numRows;i++){for(int j=0;j<len;j++){if(table[i][j]!=null){res += table[i][j];}}}return res;}}// v2.0class Solution {public String convert(String s, int numRows) {int len = s.length();if(numRows==1){return s;}StringBuilder[] array = new StringBuilder[numRows];for(int i=0;i<numRows;i++){array[i] = new StringBuilder();}int flag = 1;int size = 0;int index = 0;while(size<len){array[index].append(s.charAt(size));if(index==0){flag = 1;}else if(index==numRows-1){flag = -1;}index+=flag;size++;}String res = "";for(int i = 0;i<numRows;i++){res+=array[i].toString();}return res;}}
leetcode 344 反转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。  
class Solution {public void reverseString(char[] s) {char temp;for(int i=0;i<s.length/2;i++){temp = s[s.length-i-1];s[s.length-i-1] = s[i];s[i] = temp;}}}
剑指offer05 替换空格
请实现一个函数,把字符串 s 中的每个空格替换成”%20”。  
class Solution {public String replaceSpace(String s) {StringBuilder res = new StringBuilder();for(char c : s.toCharArray()){if(c==' '){res.append("%20");}else{res.append(c);}}return res.toString();}}
leetcode 151 翻转字符串里的单词
给定一个字符串,逐个翻转字符串中的每个单词。
class Solution {public String reverseWords(String s) {if(s==null) return null;char[] charArray = s.toCharArray();int len = charArray.length;int left = 0;int right = len-1;reverse(charArray,left,right);word_reverse(charArray,len);return clean_space(charArray,len);}//将char数组整个反转public void reverse(char[] s, int i, int j){while(i<j){char c = s[j];s[j--] = s[i];s[i++] = c;}}//反转单词public void word_reverse(char[] s, int l){int i=0;int j=0;while(j<l){//找到单词首字母while(i<l&&s[i]==' '){i++;}j=i;//找到单词末尾while(j<l&&s[j]!=' '){j++;}reverse(s,i,j-1);i = j;}}//清理多余空格public String clean_space(char[] s, int l){int i = 0;int j = 0;while(j<l){while(j<l&&s[j]==' ') j++;while(j<l&&s[j]!=' ') s[i++]=s[j++];while(j<l&&s[j]==' ') j++;if(j<l) s[i++] = ' ';}return new String(s).substring(0,i);}}
leetcode 394 字符串解码
class Solution {public String decodeString(String s) {LinkedList<Integer> num = new LinkedList<>();LinkedList<String> str = new LinkedList<>();int len = s.length();StringBuilder res = new StringBuilder();int curr = 0;for(Character c:s.toCharArray()){if(c=='['){str.add(res.toString());num.add(curr);res = new StringBuilder();curr = 0;}else if(c==']'){StringBuilder tmp = new StringBuilder(str.removeLast());int curr_num = num.removeLast();for(int i = 0;i<curr_num;i++){tmp.append(res);}res = tmp;}else if(c>='0'&&c<='9'){curr = curr*10 + c-'0';}else{res.append(c);}}return res.toString();}}
leetcode 438 找到字符串中所有字母异位词
class Solution {public List<Integer> findAnagrams(String s, String p) {int[] countS = new int[26];int[] countP = new int[26];int lengthP = p.length();int lengthS = s.length();if(lengthP>lengthS) return new ArrayList<>();for(int i=0;i<lengthP;i++){countS[s.charAt(i)-'a']++;countP[p.charAt(i)-'a']++;}List<Integer> res = new ArrayList<>();if(Arrays.equals(countP,countS)){res.add(0);}for(int i=lengthP;i<lengthS;i++){countS[s.charAt(i)-'a']++;countS[s.charAt(i-lengthP)-'a']--;if(Arrays.equals(countP,countS)){res.add(i-lengthP+1);}}return res;}}
