有效回文字符串(Valid palindrome)

题目描述

思路分析

代码实践

java:

java 复制代码
public class Solutation1 {
	//定义一个方法,判断是否是有效数字或者字母
	private static boolean isValid(char c) {
		//如果不是字母或者数字,那就返回一个flase
		//这里调用了Character类里面的方法
		return Character.isLetter(c) || Character.isDigit(c);
	}

	//判断两个字母是否相等,这里还要忽略大小写
	private static boolean isEqual(char a,char b) {

		return Character.toLowerCase(a) == Character.toLowerCase(b);
	}

	//主函数
	public static boolean isPalindrome(String s) {
		if (s == null) {
			return false;
		}

		int left = 0, right = s.length() - 1;
		while (left < right) {
			//非数字左边是++循环
			while (left < right && !isValid(s.charAt(left))) {
				left++;
			} 
			while (left < right && !isValid(s.charAt(right))) {
				right--;
			}
			//上面都跳到正确的位置
			//开始比较
			if (left < right && !isEqual(s.charAt(left), s.charAt(right))) {
				return false;//只要有一个对比不等就不是回文
			}
			left++;
			right--;
		}
		//上面如果没有跳到return,直接返回true
		return true;
		
	}

	public static void main(String[] args) {
		boolean res = isPalindrome("1b , 1");
		if (res == true) {
			System.out.println("它是回文串");
		}
	}
}

运行结果:

下面分析一下它的时间复杂度

所以时间复杂度是O(n)

下面用c++代码解决:

cpp 复制代码
#include <iostream>
#include <cctype> // 用于字符处理函数

using namespace std;

bool isValid(char c) {
    // 如果不是字母或者数字,返回false
    return isalnum(c);
}

bool isEqual(char a, char b) {
    // 忽略大小写比较两个字符是否相等
    return tolower(a) == tolower(b);
}

bool isPalindrome(string s) {

    if (s.empty()) {
        return true; // 空字符串被认为是回文串
    }

    int left = 0, right = s.length() - 1;
    while (left < right) {
        // 非字母或数字的字符,左指针右移
        while (left < right && !isValid(s[left])) {
            left++;
        }
        // 非字母或数字的字符,右指针左移
        while (left < right && !isValid(s[right])) {
            right--;
        }

        // 开始比较字符
        if (left < right && !isEqual(s[left], s[right])) {
            return false; // 只要有一个对比不等就不是回文
        }

        left++;
        right--;
    }

    return true;
}

int main() {
    bool res = isPalindrome("1b , 1");
    if (res == true) {
        printf("it is palindrome\n");
    } else {
        printf("it is not palindrome");
    }
    return 0;
}

运行结果:

上面说几个点:

1.这里引入了c语言当中的一个头文件,去进行字符判断的操作

2.下面这里为什么不进行NULL的判断

正确的方法来检查字符串是否为空。如果你尝试将空指针传递给这个函数,编译器会报错,因为它不接受指针作为参数。所以不需要额外检查指针是否为 NULL

上面的时间算法复杂度还是O(n)

好了祝早安午安晚安

相关推荐
阿龍17874 分钟前
获取metadata耗时对比(libtag/ffmpeg/gstreamer)
开发语言·qt·ffmpeg
蓝田~26 分钟前
java.sql.Date 弃用分析与替代方案
java·microsoft
论迹26 分钟前
【JavaEE】-- 计算机是如何工作的
java·java-ee·dubbo
计算机-秋大田42 分钟前
微信外卖小城程序设计与实现(LW+源码+讲解)
java·开发语言·微信·微信小程序·小程序·课程设计
老大白菜1 小时前
使用 Go 和 gqlgen 实现 GraphQL API:实战指南
开发语言·golang·graphql
2301_793069821 小时前
JAVA 接口、抽象类的关系和用处 详细解析
java·开发语言
kerwin_code1 小时前
Sentinel 控制台集成 Nacos 实现规则配置双向同步和持久化存储(提供改造后源码)
java·sentinel
大秦王多鱼1 小时前
【2025年最新版】Java JDK安装、环境配置教程 (图文非常详细)
java·开发语言
—丫丫1 小时前
uniapp商城项目之商品详情
java·javascript·uni-app
sjsjs111 小时前
【反悔堆】力扣1642. 可以到达的最远建筑
java·算法·leetcode