leetcode 3 无重复字符的最长子串

  1. class Solution {
  2. public int lengthOfLongestSubstring(String s) {
  3. // map记录字符串中字符和它出现的下标
  4. Map<Character, Integer> map = new HashMap<>();
  5. // 字符串长度
  6. int len = s.length();
  7. // 标记
  8. int left = 0;
  9. int right = 0;
  10. // 最终返回结果
  11. int res = 0;
  12. for(;right<len;right++){
  13. // 当出现过某个字符时,进入if
  14. if(map.containsKey(s.charAt(right))){
  15. // 更新结果
  16. res = Math.max(right-left, res);
  17. // 更新左边界,⭕其中max方法是本题关键,避免"abba"这种示例
  18. left = Math.max(map.get(s.charAt(right))+1,left);
  19. }
  20. map.put(s.charAt(right),right);
  21. }
  22. res = Math.max(res, right-left);
  23. return res;
  24. }
  25. }

leetcode 6 Z字形变换

  1. // v1.0 用二维数组存放字符串数据
  2. class Solution {
  3. public String convert(String s, int numRows) {
  4. if(numRows==1){
  5. return s;
  6. }
  7. int len = s.length();
  8. Character[][] table = new Character[numRows][len];
  9. int row = 0, column = 0, size = 0;
  10. boolean down = true;
  11. while(size<len){
  12. table[row][column] = s.charAt(size);
  13. if(down){
  14. row++;
  15. }else{
  16. row--;
  17. column++;
  18. }
  19. if(row==0){
  20. down = true;
  21. }else if(row == numRows-1){
  22. down = false;
  23. }
  24. size++;
  25. }
  26. String res = "";
  27. for(int i=0;i<numRows;i++){
  28. for(int j=0;j<len;j++){
  29. if(table[i][j]!=null){
  30. res += table[i][j];
  31. }
  32. }
  33. }
  34. return res;
  35. }
  36. }
  37. // v2.0
  38. class Solution {
  39. public String convert(String s, int numRows) {
  40. int len = s.length();
  41. if(numRows==1){
  42. return s;
  43. }
  44. StringBuilder[] array = new StringBuilder[numRows];
  45. for(int i=0;i<numRows;i++){
  46. array[i] = new StringBuilder();
  47. }
  48. int flag = 1;
  49. int size = 0;
  50. int index = 0;
  51. while(size<len){
  52. array[index].append(s.charAt(size));
  53. if(index==0){
  54. flag = 1;
  55. }else if(index==numRows-1){
  56. flag = -1;
  57. }
  58. index+=flag;
  59. size++;
  60. }
  61. String res = "";
  62. for(int i = 0;i<numRows;i++){
  63. res+=array[i].toString();
  64. }
  65. return res;
  66. }
  67. }

leetcode 344 反转字符串

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。

  1. class Solution {
  2. public void reverseString(char[] s) {
  3. char temp;
  4. for(int i=0;i<s.length/2;i++){
  5. temp = s[s.length-i-1];
  6. s[s.length-i-1] = s[i];
  7. s[i] = temp;
  8. }
  9. }
  10. }

剑指offer05 替换空格

请实现一个函数,把字符串 s 中的每个空格替换成”%20”。

  1. class Solution {
  2. public String replaceSpace(String s) {
  3. StringBuilder res = new StringBuilder();
  4. for(char c : s.toCharArray()){
  5. if(c==' '){
  6. res.append("%20");
  7. }else{
  8. res.append(c);
  9. }
  10. }
  11. return res.toString();
  12. }
  13. }

leetcode 151 翻转字符串里的单词

给定一个字符串,逐个翻转字符串中的每个单词。

  1. class Solution {
  2. public String reverseWords(String s) {
  3. if(s==null) return null;
  4. char[] charArray = s.toCharArray();
  5. int len = charArray.length;
  6. int left = 0;
  7. int right = len-1;
  8. reverse(charArray,left,right);
  9. word_reverse(charArray,len);
  10. return clean_space(charArray,len);
  11. }
  12. //将char数组整个反转
  13. public void reverse(char[] s, int i, int j){
  14. while(i<j){
  15. char c = s[j];
  16. s[j--] = s[i];
  17. s[i++] = c;
  18. }
  19. }
  20. //反转单词
  21. public void word_reverse(char[] s, int l){
  22. int i=0;
  23. int j=0;
  24. while(j<l){
  25. //找到单词首字母
  26. while(i<l&&s[i]==' '){
  27. i++;
  28. }
  29. j=i;
  30. //找到单词末尾
  31. while(j<l&&s[j]!=' '){
  32. j++;
  33. }
  34. reverse(s,i,j-1);
  35. i = j;
  36. }
  37. }
  38. //清理多余空格
  39. public String clean_space(char[] s, int l){
  40. int i = 0;
  41. int j = 0;
  42. while(j<l){
  43. while(j<l&&s[j]==' ') j++;
  44. while(j<l&&s[j]!=' ') s[i++]=s[j++];
  45. while(j<l&&s[j]==' ') j++;
  46. if(j<l) s[i++] = ' ';
  47. }
  48. return new String(s).substring(0,i);
  49. }
  50. }

leetcode 394 字符串解码

  1. class Solution {
  2. public String decodeString(String s) {
  3. LinkedList<Integer> num = new LinkedList<>();
  4. LinkedList<String> str = new LinkedList<>();
  5. int len = s.length();
  6. StringBuilder res = new StringBuilder();
  7. int curr = 0;
  8. for(Character c:s.toCharArray()){
  9. if(c=='['){
  10. str.add(res.toString());
  11. num.add(curr);
  12. res = new StringBuilder();
  13. curr = 0;
  14. }else if(c==']'){
  15. StringBuilder tmp = new StringBuilder(str.removeLast());
  16. int curr_num = num.removeLast();
  17. for(int i = 0;i<curr_num;i++){
  18. tmp.append(res);
  19. }
  20. res = tmp;
  21. }else if(c>='0'&&c<='9'){
  22. curr = curr*10 + c-'0';
  23. }else{
  24. res.append(c);
  25. }
  26. }
  27. return res.toString();
  28. }
  29. }

leetcode 438 找到字符串中所有字母异位词

  1. class Solution {
  2. public List<Integer> findAnagrams(String s, String p) {
  3. int[] countS = new int[26];
  4. int[] countP = new int[26];
  5. int lengthP = p.length();
  6. int lengthS = s.length();
  7. if(lengthP>lengthS) return new ArrayList<>();
  8. for(int i=0;i<lengthP;i++){
  9. countS[s.charAt(i)-'a']++;
  10. countP[p.charAt(i)-'a']++;
  11. }
  12. List<Integer> res = new ArrayList<>();
  13. if(Arrays.equals(countP,countS)){
  14. res.add(0);
  15. }
  16. for(int i=lengthP;i<lengthS;i++){
  17. countS[s.charAt(i)-'a']++;
  18. countS[s.charAt(i-lengthP)-'a']--;
  19. if(Arrays.equals(countP,countS)){
  20. res.add(i-lengthP+1);
  21. }
  22. }
  23. return res;
  24. }
  25. }