天天看点

解决如何验证一个字符串是否是回文字符串

问题:

验证一个字符串是否是回文字符串,只验证字符串中国的字母和数字,
字母不区分大小写。
           

解决方式一:

先去除掉字符串中的非字母和非数字,通过reverse()方法逆序得到另一个字符串
,若两个项目则是回文字符串;
           

代码一:

public boolean judge(String s1){
	StringBuffer sber = new StringBuffer();
	for(int i=0;i<s1.length;i++){
		char c = s1.charAt(i);
		if(Character.isLetterOrDigit(c){
			sber.append(Character.toLowerCase(c);
		}
	}
	StringBuffer s2 = new StringBuffer(sber).reverse();
    return sber.toString().equals(s2.toString());
}
           

解决方式二:

使用双指针,先刷选出非字母和数字,一个在字符串头部,一个在尾部,
直到两个指针相等;
           

代码二:

public boolean judge(String s1){
	StringBuffer sber = new StringBuffer();
	for(int i=0;i<s1.length;i++){
		char c = s1.charAt(i);
		if(Character.isLetterOrDigit(c){
			sber.append(Character.toLowerCase(c);
		}
	}
	int left = 0;
	int right = sber.length-1;
	while(left<right){
		if(Charater.toLowerCase(sber.charAt(left)) != Character.toLowerCase(sber.charAt(right))){
			return false;
		}
		++left;
		--right;
	}
	return true;
}
           

解决方式三:

双指针,分别在字符串左右,不筛选,直接在原字符串上比较,
遇到非字母和数字,则跳转下一个再比较;
           

代码三:

public boolean judge(String s1){
	StringBuffer sber = new StringBuffer();
	int left = 0;
	int right = s1-1;
	while(left<right){
		while(left<right && !Character.isLetterOrDigit(s1.charAt(left))){
			++left;
		}
		while(left<right && !Character.isLetterOrDigit(s1.charAt(right))){
			--right;
		}
		if(left<right){
			if(Charater.toLowerCase(sber.charAt(left)) != Character.toLowerCase(sber.charAt(right))){
			return false;
			}
			++left;
			--right;
		}
	}
	return true;
}
           

涉及类和方法:

String.charAt(int i): 取字符串中的某个字符

Chararter.isLetterOrDigit(char c):判断是否是数字或者字母

Character.toLowerCase(char c):把字母全部变为小写

StringBuffer.reverse():把字符串倒序

继续阅读