• 算法通关村第12关【白银】| 字符串经典问题


    一、反转问题

    1.反转字符串

    思路:双指针,反转数组一个套路

    1. class Solution {
    2. public void reverseString(char[] s) {
    3. int l = 0;
    4. int r = s.length -1;
    5. while(l
    6. char c = s[l];
    7. s[l] = s[r];
    8. s[r] = c;
    9. l++;
    10. r--;
    11. }
    12. }
    13. }

    2.k个一组反转

    思路:每k个进行一次反转函数,从i++变成i+=2*k

    1. class Solution {
    2. public String reverseStr(String s, int k) {
    3. if(s == null || s.length() == 0){
    4. return s;
    5. }
    6. int len = s.length();
    7. char[] str = s.toCharArray();
    8. for(int i = 0;i2*k){
    9. revers(str,i,Math.min(i+k-1,len-1));
    10. }
    11. return new String(str);
    12. }
    13. public void revers(char[] s,int l,int r){
    14. while(l
    15. char c = s[l];
    16. s[l] = s[r];
    17. s[r] = c;
    18. l++;
    19. r--;
    20. }
    21. }
    22. }

    3.仅仅反转字母

    思路:

    方法一、双指针

    1. class Solution {
    2. public String reverseOnlyLetters(String s) {
    3. if(s==null || s.length() == 0){
    4. return s;
    5. }
    6. int l = 0;
    7. int r = s.length() -1;
    8. char[] str = s.toCharArray();
    9. while(l
    10. while(l
    11. l++;
    12. }
    13. while(r>=0&&!Character.isLetter(str[r])){
    14. r--;
    15. }
    16. if(l
    17. char c = str[l];
    18. str[l] = str[r];
    19. str[r] = c;
    20. l++;
    21. r--;
    22. }
    23. }
    24. return new String(str);
    25. }
    26. }

    方法二、使用栈,实现出栈反转

    字母压入栈中,遇到字母弹出栈顶拼接进结果集

    1. class Solution {
    2. public String reverseOnlyLetters(String s) {
    3. if(s==null || s.length() == 0){
    4. return s;
    5. }
    6. char[] str = s.toCharArray();
    7. Stack stack = new Stack();
    8. for(int i = 0;i
    9. if(Character.isLetter(str[i])){
    10. stack.push(str[i]);
    11. }
    12. }
    13. StringBuilder sb = new StringBuilder();
    14. for(char c : str){
    15. if(Character.isLetter(c)){
    16. sb.append(stack.pop());
    17. }else{
    18. sb.append(c);
    19. }
    20. }
    21. return new String(sb);
    22. }
    23. }

    4.反转字符串中的单词

    思路:整体反转+局部反转 = 区间反转

    1. class Solution {
    2. public String reverseWords(String s) {
    3. StringBuilder sb = trimSpaces(s);
    4. int len = sb.length();
    5. reverse(sb,0,len - 1);
    6. int i = 0;
    7. for(int j = 0;j<=len;j++){
    8. if(j == len||sb.charAt(j) == ' '){
    9. reverse(sb,i,j-1);
    10. i = j+1;
    11. }
    12. }
    13. return sb.toString();
    14. }
    15. public StringBuilder trimSpaces(String s) {
    16. int left = 0, right = s.length() - 1;
    17. // 去掉字符串开头的空白字符
    18. while (left <= right && s.charAt(left) == ' ') {
    19. ++left;
    20. }
    21. // 去掉字符串末尾的空白字符
    22. while (left <= right && s.charAt(right) == ' ') {
    23. --right;
    24. }
    25. // 将字符串间多余的空白字符去除
    26. StringBuilder sb = new StringBuilder();
    27. while (left <= right) {
    28. char c = s.charAt(left);
    29. if (c != ' ') {
    30. sb.append(c);
    31. } else if (sb.charAt(sb.length() - 1) != ' ') {
    32. sb.append(c);
    33. }
    34. ++left;
    35. }
    36. return sb;
    37. }
    38. public void reverse(StringBuilder sb, int left, int right) {
    39. while (left < right) {
    40. char tmp = sb.charAt(left);
    41. sb.setCharAt(left++, sb.charAt(right));
    42. sb.setCharAt(right--, tmp);
    43. }
    44. }
    45. }

    二、验证回文串

    思路:双指针,跳过非字母数字

    1. class Solution {
    2. public boolean isPalindrome(String s) {
    3. if(s == null || s.length() == 0){
    4. return true;
    5. }
    6. int l = 0;
    7. int r = s.length() - 1;
    8. char[] str = s.toCharArray();
    9. while(l
    10. while(l
    11. l++;
    12. }
    13. while(l
    14. r--;
    15. }
    16. if(Character.toLowerCase(str[l]) != Character.toLowerCase(str[r])){
    17. return false;
    18. }
    19. l++;
    20. r--;
    21. }
    22. return true;
    23. }
    24. }

    三、字符串中的第一个唯一字符

     思路:哈希表来映射索引,当出现次数超过1就赋值-1标记,最后遍历一遍哈希表返回最小值

    1. class Solution {
    2. public int firstUniqChar(String s) {
    3. HashMap map = new HashMap<>();
    4. int min = Integer.MAX_VALUE;
    5. int len = s.length();
    6. for(int i = 0;i
    7. char c = s.charAt(i);
    8. if(map.containsKey(c)){
    9. map.put(c,-1);
    10. }else{
    11. map.put(c,i);
    12. }
    13. }
    14. for(Object o : map.values()){
    15. Integer v = (Integer) o;
    16. if(v != -1 && v
    17. min = v;
    18. }
    19. }
    20. return min == Integer.MAX_VALUE ? -1 : min;
    21. }
    22. }

    四、有效的字母异位词

    思路:

    方法一、排序,之后比较是否相等

    1. class Solution {
    2. public boolean isAnagram(String s, String t) {
    3. if (s.length() != t.length()) {
    4. return false;
    5. }
    6. char[] str1 = s.toCharArray();
    7. char[] str2 = t.toCharArray();
    8. Arrays.sort(str1);
    9. Arrays.sort(str2);
    10. return Arrays.equals(str1, str2);
    11. }
    12. }

    方法二、哈希表存储,比较出现次数是否相同

    数组实现

    1. class Solution {
    2. public boolean isAnagram(String s, String t) {
    3. int[] temp = new int[26];
    4. for(char c : s.toCharArray()){
    5. temp[c-'a'] += 1;
    6. }
    7. for(char c : t.toCharArray()){
    8. temp[c-'a'] -= 1;
    9. }
    10. for(int i : temp){
    11. if(i != 0){
    12. return false;
    13. }
    14. }
    15. return true;
    16. }
    17. }

    集合实现,更有通用性,不是字母也可以比较

    1. class Solution {
    2. public boolean isAnagram(String s, String t) {
    3. Map maps = new HashMap<>();
    4. Map mapt = new HashMap<>();
    5. for(Character c : s.toCharArray()){
    6. maps.put(c,maps.getOrDefault(c,0)+1);
    7. }
    8. for(Character c : t.toCharArray()){
    9. mapt.put(c,mapt.getOrDefault(c,0)+1);
    10. }
    11. for(Object key : maps.keySet()){
    12. if(!mapt.containsKey(key) || !maps.get(key).equals(mapt.get(key))){
    13. return false;
    14. }
    15. mapt.remove(key);
    16. }
    17. return mapt.isEmpty() ? true : false;
    18. }
    19. }

  • 相关阅读:
    不添加端口号访问非80网站
    力扣438:找到字符串中所有字母异位词
    dataframe保存excel格式比csv格式小很多很多
    0-JavaWeb基础总结
    树莓派系统安装,使用SSD/U盘启动centos
    React框架创建项目详细流程-项目的基本配置-项目的代码规范
    FastDFS收藏起来,现在开始用Minio吧
    阿里云服务器ECS共享型和企业级是什么?
    windows powershell 将U盘启动盘还原回普通U盘
    如何使用pywinauto实现一个股票自动交易系统?
  • 原文地址:https://blog.csdn.net/Candy___i/article/details/132711196