0
点赞
收藏
分享

微信扫一扫

3.<tag-字符串和双指针>-lt- 165. 比较版本号 +lt -125. 验证回文串

悄然丝语 2022-04-18 阅读 28
算法

lt- 165. 比较版本号

[案例需求]
在这里插入图片描述

[思路分析一, 采用了api]

  • . 分割字符串, 把两个字符串中每个点中间的字符直接转换为数字进行比较即可.
    [代码实现]
//采用了api
class Solution {
    public int compareVersion(String version1, String version2) {
        //split
        String[] v1 = version1.split("\\.");
        String[] v2 = version2.split("\\.");

        for(int i = 0; i < Math.max(v1.length, v2.length); i++){
            int v1Number = i >= v1.length ? 0 : Integer.valueOf(v1[i]);
            int v2Number = i >= v2.length ? 0 : Integer.valueOf(v2[i]);

            if(v1Number > v2Number){
                return 1;
            }else if(v1Number < v2Number){
                return -1;
            }
        }

        return 0;
    }
}
  • 时空复杂度分析:
    • 时间复杂度:O(n+m)(或 O(max(n,m)),这是等价的),其中 n 是字符串version1 的长度,m 是字符串version2 的长度。
    • 空间复杂度:O(n+m),我们需要 O(n+m) 的空间存储分割后的修订号列表。

在这里插入图片描述

  • 如果不使用split分割.的话, 我们可以直接把他跳过去;
  • 采用双指针法同时遍历两个字符串

[代码示例]

class Solution {
    public int compareVersion(String version1, String version2) {
        //循环取出v1和v2的char 字符进行比较
        // 把 . 跳过去
        int v1Length = version1.length();
        int v2Length = version2.length();

        int i = 0, j = 0;

        //你可能会问: i, j 不等长怎么办
        // 每一次循环之前我们都把存储v1, v2的两个变量置为零
        // 等遍历到发现不为0时再改过来不就行了
        while(i < v1Length || j < v2Length){
            int x = 0; // v1的数

            //取出v1的数
            while(i < v1Length && version1.charAt(i) != '.'){
                x = x* 10 + version1.charAt(i) - '0';
                ++i;
            }
            ++i;

            int y = 0;
            //取出v2的数
            while(j < v2Length && version2.charAt(j) != '.'){
                y = y * 10 + version2.charAt(j) - '0';
                ++j;
            }
            ++j;
            //比较
            if(x > y){
                return 1;
            }else if(x < y){
                return -1;
            }
        }
        return 0;
    }
}
  • 时空复杂度:
    • 时间复杂度:O(n+m),其中 n 是字符串 version1 的长度,mm 是字符串 version2 的长度。
    • 空间复杂度:O(1),我们只需要常数的空间保存若干变量。

在这里插入图片描述

lt -125. 验证回文串

[案例需求]
在这里插入图片描述

[思路分析一, api战士]

  • 根据题目, 只有数字和大小写字母才能用来比较回文串. 所以需要采用api或者自写判断来过滤从string中遍历的字符;
//1.  使用Character的判断方法: isDigitOrLetter()
char ch = str.charAt(i);
Character.isDigitOrLetter();

//2. 自写判断条件
char ch = str.charAt(i);

public void isDigitOrLetter(){
	return ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= 0 && ch <=9));
}
//字符串
str.toLowerCase();
str.toUpperCase();

//字符
// 本来java中char是基本数据类型, 所以大小写操作都放在了char的包装类中实现的
Character.toLowerCase(ch);
Character.toUpperCase(ch);

[代码实现]

class Solution {
    public boolean isPalindrome(String s) {
       //筛选. 比较
       StringBuilder sb = new StringBuilder();
       int len = s.length();
    
       for(int i = 0; i < len; i++){
           
           char ch = s.charAt(i);

           if(Character.isLetterOrDigit(ch)){
               sb.append(Character.toLowerCase(ch));
           }
       }

        StringBuilder sb1 = new StringBuilder(sb).reverse();
       return sb.toString().equals(sb1 .toString());
    }
}

[思路分析二, 双指针]

[代码示例]

class Solution {
    public boolean isPalindrome(String s) {
        int n = s.length();
        int left = 0, right = n - 1;
        while (left < right) {
            while (left < right && !Character.isLetterOrDigit(s.charAt(left))) {
                ++left;
            }
            while (left < right && !Character.isLetterOrDigit(s.charAt(right))) {
                --right;
            }
            if (left < right) {
                if (Character.toLowerCase(s.charAt(left)) != Character.toLowerCase(s.charAt(right))) {
                    return false;
                }
                ++left;
                --right;
            }
        }
        return true;
    }
}

举报

相关推荐

0 条评论