首页 > 试题广场 >

判断回文串

[编程题]判断回文串
  • 热度指数:30536 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
判断题目给出的字符串是不是回文,仅考虑字符串中的字母字符和数字字符,并且忽略大小写
例如:"nowcoder Is Best tsebsi: redoc won"是回文
"race a car"不是回文
注意:
你有没有考虑过字符串可能为空?这是面试时应该提出的一个好问题。
针对这个问题,我们定义空字符串是回文
示例1

输入

"nowcoder Is Best tsebsi: redoc won"

输出

true
示例2

输入

"race a car"

输出

false
import java.util.*;


public class Solution {
    /**
     * 
     * @param s string字符串 
     * @return bool布尔型
     */
    public boolean isPalindrome (String s) {
        // write code here
        s=s.toLowerCase();
       int i=0,j=s.length()-1;
        while(i<j)
        {
                while(i<j&&(s.charAt(i)<'a'||s.charAt(i)>'z')&&(s.charAt(i)<'0'||s.charAt(i)>'9'))
                    i++;
                while(i<j&&(s.charAt(j)<'a'||s.charAt(j)>'z')&&(s.charAt(j)<'0'||s.charAt(j)>'9'))
                    j--;
               if(s.charAt(i)!=s.charAt(j))
                return false;
               else
               {
                   i++; j--;
               }
        }
        
        return true;
}
}

发表于 2022-05-25 23:36:17 回复(0)
    public boolean isPalindrome (String s) {
        if(s == null) return false;
        if(s != null && s.length() == 0) return true;
        //双指针-左右指针
        int left = 0;
        int right = s.length() - 1;
        char[] array = s.toCharArray();
        while(left < right){
            //处理非英文字母和空格
            while(left < right && !((array[left] >= 'a' && array[left] <= 'z') || (array[left] >= 'A' && array[left] <= 'Z') || (array[left] >= '0' && array[left] <='9'))){
                left++;
            }
            while(left < right && !((array[right] >= 'a' && array[right] <= 'z') || (array[right] >= 'A' && array[right] <= 'Z') || (array[right] >= '0' && array[right] <='9'))){
                right--;
            }
           
            
            //左右指针对应数组元素匹配比较
            if(!(
               (((array[left] >= 'a' && array[left] <= 'z') || (array[left] >= 'A' && array[left] <= 'Z')) && 
               ((array[right] >= 'a' && array[right] <= 'z') || (array[right] >= 'A' && array[right] <= 'Z')) &&
               //通过ASCIL区分大小写
               ((array[left] + 32 == array[right]) || (array[left] - 32 == array[right]))) 
                || array[left] == array[right])){
               return false;
            }
            left++;
            right--;
        }
        //匹配成功
        return true;
    }

发表于 2021-11-03 17:15:59 回复(0)
import java.util.*;

public class Solution {
    /**
     * @param s string字符串 
     * @return bool布尔型
     */
    public boolean isPalindrome (String s) {
         s=s.replace(" ","");//去掉空格
        char[]str_list=s.toCharArray();
       //遍历,忽略非法字符
        int i=0,j=str_list.length-1,n1,n2;
        while (i<j){//逐个对比,遇到非法字符忽略
            while(i<str_list.length&&!Islegal(str_list[i]))
                i++;
            if(i==str_list.length) return true;//如果走到头说明都是非法字符,返回true
            while(j>=i&&!Islegal(str_list[j]))
                j--;
          
            n1=str_list[i];
            n2=str_list[j];
            if(n1==n2||Math.abs(n1-n2)==32){//要么相等,要么是大小写的关系
                  i++;j--;
            }
            else
                break;
        }
        if(i>=j)
            return true;
        else
            return false;
    }
        static boolean Islegal(char cha){//判断一个字符是否为合法字符(即数字或字母)
        if((cha>='a'&&cha<='z')||(cha>='A'&&cha<='Z')||(cha>='0'&&cha<='9'))
            return true;
        return  false;
    }

}


编辑于 2020-11-08 16:52:48 回复(1)
public boolean isPalindrome (String s) {
        /*
非递归
        时间复杂度:O(n)
        空间复杂度:
        */
        //为空的情况
        if(s==null){
            return false;
        }
        //忽略大小写,统一转成大写或者小写
        String strLower = s.toLowerCase();
        //转成字符数组
        char[] str = strLower.toCharArray();
        ArrayList list = new ArrayList();
        //遍历字符数组,筛选符合条件的元素存储到list中
        for(int i=0;i<str.length;i++){
            if((str[i]>='0'&&str[i]<='9')||(str[i]>='a'&&str[i]<='z')){
                list.add(str[i]);
            }
        }
        //一个从头,一个从尾,两两比较
        int j = list.size()-1;
        for(int i=0;i<list.size();i++){
            if(list.get(i)==list.get(j)||i>j){
                j--;
            }else{
                return false;
            }
        }
        return true;
    }

编辑于 2020-09-21 09:01:23 回复(0)
public class Solution {
    public boolean isPalindrome(String s) {
        if(s==null)
            return true;
        String str =s.toLowerCase();
        String str1 = str.replaceAll("\\W", "");
        return new StringBuilder(str1).reverse().toString().equals(str1);
    }
}

发表于 2020-04-13 17:31:29 回复(0)
public class Solution {
    public boolean isPalindrome(String s) {
        //添加一个判断字符是否为字符或数字的方法,如果不是则字符串下面的
        //位置加1,比较之前还需要把字符通过Character.toLowerCase(s.charAt(i))
        //转换成小写的字符
        int begin = 0;
        int end = s.length() - 1;
        while(begin < end)
        {
            while(!isCharOrNum(s.charAt(begin)) && begin < end)
            {begin ++;}
            while(!isCharOrNum(s.charAt(end)) && begin < end)
            {end --;}
            if(Character.toLowerCase(s.charAt(begin)) != 
               Character.toLowerCase(s.charAt(end)))
                return false;
            begin ++;
            end --;
        }
        return true;
    }
    public boolean isCharOrNum(char c)
    {
        if((c >= '0' && c <= '9')
          || (c >= 'a' && c <= 'z')
          || (c >= 'A' && c <= 'Z'))
            return true;
        return false;
    }
}

发表于 2020-01-11 13:27:07 回复(0)
public class Solution {
    public boolean isPalindrome(String s) {
        if(s.equals(""))return true;
        int j = 0;
        s = s.toUpperCase();
        char []str = new char [s.length()];
        for(int i = 0;i<s.length();i++){
            if((s.charAt(i)>='A'&&s.charAt(i)<='Z')||(s.charAt(i)>='0'&&s.charAt(i)<='9')){
                str[j++] = s.charAt(i);    
            }
        }
        for(int i = 0;i<j/2;i++){
            if(str[i]!=str[j-i-1])
                return false;
        }
        return true;
    }
}
/*

运行时间:165ms

占用内存:16564k

*/
发表于 2019-11-03 12:07:14 回复(0)
不通过  请问为什么会报错????????cry,搞了一小时了到底哪个数据有问题
请检查是否存在数组越界等非法访问情况
case通过率为0.00%
public class Solution {
    public boolean isPalindrome(String s) {
        String str = s.replaceAll("\\W", "");
        if(str.length()<=1) return true;
        return helper(str.toUpperCase(),0, str.length());
    }
    public boolean helper(String s, int begin, int len){
        if(begin<len>>1&&s.charAt(begin)==s.charAt(len-begin-1))
            return helper(s, begin+1, len);
        else if(begin==len>>1) return true;
        else return false;
    }
}

发表于 2019-03-03 21:00:03 回复(0)
使用Stack来进行逆序,再逐个检查
import java.util.*;
public class Solution {
    public boolean isPalindrome(String s) {
        if (s == null || s.equals("")) {
            return true;
        }
        s = s.toLowerCase();
        s = s.replaceAll("[^a-zA-Z0-9]", "");
        char[] chs = s.toCharArray();
        Stack<Character> stack = new Stack<>();
        for (int i=0; i < chs.length; i++) {
            stack.push(chs[i]);
        }
        for (int i=0; i < chs.length; i++) {
            if (chs[i] != stack.pop()) {
                break;
            }
        }
        if (stack.isEmpty()) {
            return true;
        } else {
            return false;
        }
    }
}
不实用栈,只依靠函数递归,PS:牛客上运行不了,要到leetcode找原题才可以通过
public boolean isPalindrome(String s) {
        if (s == null || s.equals("")) {
            return true;
        }
        s = s.toLowerCase();    // 忽略大小写
        s = s.replaceAll("[^a-zA-Z0-9]", "");    // 只保留字母和数字
        if (s.equals("")) {
            return true;
        }
        char[] chs = s.toCharArray();
        return isPalindrome(chs, 0);
    }
    
    public boolean isPalindrome(char[] chs, int cur) {
        if (cur == chs.length) {
            return true;
        }
        return (chs[cur] == chs[chs.length-1-cur]) && isPalindrome(chs, cur+1);
    }

编辑于 2019-02-17 10:21:27 回复(0)
public class Solution {
    public boolean isPalindrome(String s) {
        StringBuffer sb = new StringBuffer(s.replaceAll("\\W", "").toLowerCase());
        if(sb.toString().equals(sb.reverse().toString())) {
            return true;
        } else {
            return false;
        }
    }
}
编辑于 2018-08-01 10:00:10 回复(0)
import java.util.Stack;
public class Solution {
    public static boolean isPalindrome(String s) {
        if (s == null || s.length() == 0) {
            return true;
        }
        String str = s.toLowerCase();
        Stack<Character> stack = new Stack<>();
        for (int i = 0; i < str.length(); ++i) {
            //判断是否是alphanumeric characters,但是系统评测好像把数字也作为alphanumeric characters了
            if (str.charAt(i) >= 'a' && str.charAt(i) <= 'z'||str.charAt(i)>='0'&&str.charAt(i)<='9')
                stack.push(str.charAt(i));
        }
        char c;
        for (int i = 0; i < str.length(); ++i) {
            if (str.charAt(i) >= 'a' && str.charAt(i) <= 'z'||str.charAt(i)>='0'&&str.charAt(i)<='9') {
                c = stack.pop();
                
                if (c != str.charAt(i)) {
                    return false;
                }
            }

        }
        return true;
        
        // return isPli(str, 0, str.length() - 1);
    }
//递归的方法:但是报stackoverflow错。在自己编译器里是可以通过的
    private static boolean isPli(String s, int start, int end) {

        while (start < s.length() && (s.charAt(start) > 'z' || s.charAt(start) < 'a')) {
            start++;
        }
        while (end >= 0 && (s.charAt(end) > 'z' || s.charAt(end) < 'a')) {
            end--;
        }
        if (start >= end) {
            return true;
        }
        if(s.charAt(start)!=s.charAt(end)){
            return false;
        }
        return isPli(s, start+1, end-1);
    }

    public static void main(String[] args) {
        String s = "raca a car\"";
        System.out.println(isPalindrome(s));
    }

}
 
发表于 2017-12-16 19:59:45 回复(0)
//大佬们帮我看一下 我这程序有什么问题!是编辑器出问题了还是我的代码错了
//我真的好无语啊,之前的题目也有这样的现象
public boolean isPalindrome(String s) {
    StringBuilder ss = new StringBuilder();
	for (char c : s.toCharArray()) ss.append(Character.isLetter(c) ? Character.toLowerCase(c) : "");
	return isPalin(ss);
}
public static boolean isPalin(StringBuilder ss) {
	int i = 0;
	int j = ss.length() - 1;
	while (i < j && ss.charAt(i++) == ss.charAt(j--)) ;
	return i >= j;
}

发表于 2017-08-16 18:33:48 回复(0)
public class Solution {
    public boolean isPalindrome(String s) {
        if (s == null || s.length() == 0)
            return true;
        StringBuilder buffer = new StringBuilder();
        String temp = s.toLowerCase();
        char tempChar = ' ';
        for (int i = 0; i < temp.length(); ++i) {
            tempChar = temp.charAt(i);
            if ((tempChar <= 'z' && tempChar >= 'a') || (tempChar <= '9' && tempChar >= '0'))
                buffer.append(tempChar);
        }
        if (buffer.length() == 0)
            return true;
        int start = 0;
        int end = buffer.length() - 1;
        boolean isPalindrome = true;
        while (start < end) {
            if (buffer.charAt(start) != buffer.charAt(end))
                return false;
            ++start;
            --end;
        }
        return isPalindrome;
    }
}

发表于 2017-07-29 17:30:53 回复(0)
 public boolean isPalindrome(String s) {
        int lenS=s.length();
        if(lenS==0)return true;
        String bString=s.replaceAll("\\W", "").toUpperCase();//正则表达式 过滤掉不是数字和字母的字符
        int lenE=bString.length();
        if(lenE==0)return true;
        return isCharOrNumberPalindrome(bString);
    }
    //判断是否是回文数
    public boolean isCharOrNumberPalindrome(String s){
        int len=s.length();
        for(int i=0,j=len-1;i<j;i++,j--){
            if(s.charAt(i)!=s.charAt(j)){
                return false;
            }
        }
        return true;
    }
编辑于 2017-06-29 10:09:22 回复(0)
import java.util.*;
public class Solution {
    public boolean isPalindrome(String s) {
        if(s==""||s==null)
            return true;
        int l=0,r=s.length()-1;
        while(l<r){
            while(l<s.length()&&!judge(s.charAt(l)))
                l++;
            while(r>=0&&!judge(s.charAt(r)))
                r--;
            if(l>=s.length()||r<0)
                return true;
            char a=s.charAt(l);
            char b=s.charAt(r);
            if(a==b||Math.abs(a-b)==32){
                l++;
            	r--;
            }
            else
                return false;
        }
        return true;
    }
    public boolean judge(char c){
        if((c<='9'&&c>='0')||(c<='z'&&c>='a')||(c<='Z'&&c>='A'))
            return true;
        else
            return false;
    }
}

发表于 2017-05-14 15:24:26 回复(0)
public boolean isPalindrome(String s) {
if(s==null||s.trim()==""){
return false;
}
        s = s.toLowerCase().trim();
        char[] cs = s.toCharArray();
        int first = 0;
        int last = cs.length-1;
        while(first<=last){
        if(cs[first]!=cs[last]){
        return false;
        }
       
        first++;
    last--;
        }
        return true;
    }
这个写法有什么问题吗   eclipse上测试没什么问题  但是牛客上一个a的时候就显示false
发表于 2017-04-09 11:50:33 回复(3)
public class Solution {
    public static boolean isPalindrome(String s) {
		int i = 0;
		int j = s.length() - 1;
		while (i < j) {
			while (i < j && ! (Character.isDigit(s.charAt(i)) || Character.isLetter(s.charAt(i))))
				i ++;
			while (i < j && ! (Character.isDigit(s.charAt(j)) || Character.isLetter(s.charAt(j))))
				j --;
			if(i < j && Character.toLowerCase(s.charAt(i)) != Character.toLowerCase(s.charAt(j))) return false;
			i ++;
			j --;
		}
		return true;
	}
}

发表于 2017-03-19 20:27:55 回复(0)
public class Solution { public boolean isPalindrome(String s) { if (s.isEmpty()) { return true;
        } int head = 0, tail = s.length() - 1; char cHead, cTail; while(head <= tail) {
        	cHead = s.charAt(head);
        	cTail = s.charAt(tail); if (!Character.isLetterOrDigit(cHead)) {
        		head++;
        	} else if(!Character.isLetterOrDigit(cTail)) {
        		tail--;
        	} else { if (Character.toLowerCase(cHead) != Character.toLowerCase(cTail)) { return false;
        		}
        		head++;
        		tail--;
        	}
        } return true;
    }
}

发表于 2017-03-11 23:15:33 回复(0)

问题信息

难度:
19条回答 28872浏览

热门推荐

通过挑战的用户

查看代码
判断回文串