每日算法(9)——回文字符串

本文介绍了两种判断回文字符串的方法:一种是通过比较字符串一半长度内的对应字符来判断,另一种是将字符串反转后再进行比较。提供了具体的Java实现代码,并展示了测试结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、回文字符串介绍

回文字符串是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文字符串。
参考百度

2、算法思路

(1)以二分之一的位置为基准,依次比较两边对应的字符;
(2)字符串倒置后直接比较。

3、具体代码

package com.peter.algorithm.other;

import org.junit.Test;
import java.util.*;

public class PalindromeString {
    @Test
    public void test() {
        String origin1 = "hellolleh";
        String origin2 = "helloworld";
        String result1 = isPalindromicStringByCompare(origin1) ? " is a " : " is not a ";
        System.out.println(origin1 + result1 + "palindrome string.");
        String result2 = isPalindromicStringByReverse(origin2) ? " is a " : " is not a ";
        System.out.println(origin1 + result2 + "palindrome string.");
    }

    public static boolean isPalindromicStringByCompare(String origin) {
        if (origin == null || origin.isEmpty()) {
            return false;
        }
        boolean result = true;
        char[] chars = origin.toCharArray();
        int len = chars.length;
        int middle = len / 2;
        for (int i = 0; i < middle; i++) {
            if (chars[i] != chars[len - i - 1]) {
                result = false;
                break;
            }
        }
        return result;
    }

    public static boolean isPalindromicStringByReverse(String origin) {
        if (origin == null || origin.isEmpty()) {
            return false;
        }
        StringBuilder stringBuilder = new StringBuilder(origin);
        String tempStr = stringBuilder.reverse().toString();
        return origin.equals(tempStr) ? true : false;
    }
}

4、测试结果

origin stringtarget
hellollehtrue
helloworldfalse
<think>嗯,用户让我用Python写一个函数来判断输入的字符串是否是回文串。首先,我得理解什么是回文串回文串就是反着一样字符串,比如"level"或者"noon"。那这个函数应该怎么设计呢? 首先,我需要考虑输入的参数是什么类型。题目里说是输入字符,可能是指字符串吧。比如输入"abcba",返True;输入"hello",返False。那函数的参数应该是一个字符串,比如def is_palindrome(s):这样开始。 接下来,怎么判断这个字符串是否是回文呢?最简单的方法就是把字符串反转,然后字符串比较。如果相等,就是回文。在Python里,字符串反转可以用切片操作,s[::-1]。那函数可以写成return s == s[::-1]。这应该是最直接的写法了。 不过,可能要考虑一些特殊情况。比如,用户输入的字符串是否区分大小写?比如"AbbA"这种情况,如果用户认为大小写不同的字符不算回文的话,那需要先把所有字符转为小写或者大写。比如,在比较之前,将s处理成s.lower()或者s.upper()。但题目里没有说明这一点,所以可能需要询问用户是否需要处理这种情况。不过题目里可能默认是严格匹配的,包括大小写。所以可能需要根据题目要求来决定。如果题目中的例子是区分大小写的,那可能不需要处理,否则需要处理。 另外,字符串中可能有非字母数字的字符,比如空格、标点符号等。比如"racecar"是回文,但如果是"A man, a plan, a canal: Panama",这时候需要去除空格标点,再判断。但题目中的例子可能只是简单的字符串,所以是否需要处理这些情况呢?题目中的例子可能没有说明,所以可能需要先明确需求。但用户给出的问题描述中,回文串的定义是反读一样,可能意味着整个字符串,包括所有字符都要严格对称。所以是否需要预处理? 比如,如果用户输入的是"abc, cba",反转后是"ab c,cba",这样原字符串的反转可能并不是相同的。所以是否需要先清理字符串中的非字母数字字符,并统一大小写?这取决于题目是否需要考虑这些情况。但原问题可能没有特别说明,所以可能应该按照最简单的处理方式,直接比较反转后的字符串,不考虑大小写特殊字符。 不过,可能用户期望的是更通用的解决方案,比如忽略大小写非字母数字字符。比如常见的回文判断题中,像LeetCode上的题目会有这样的要求。例如,题目示例中的"A man, a plan, a canal: Panama"应该被视为True。这时候需要处理。 所以,可能需要先处理字符串,去掉非字母数字字符,并转换为统一小写,然后再比较。但用户的问题描述是否包含这些情况呢?题目中的定义是“反读一样字符串”,可能这里的“”指的是字符本身,包括所有符号,所以是否需要处理? 这时候可能需要进一步分析。但用户给出的例子可能是一个简单的例子,所以可能先不考虑这些复杂情况,写一个基本版本,然后在需要的时候扩展。 比如,用户可能希望这个函数能够处理不同情况,所以可以写出两种版本:一种是简单的不处理任何字符,直接反转比较;另一种是处理后的。 但用户的问题是“设计一个函数”,而给出的例子是Python代码,所以可能需要先写一个基本版本,然后讨论可能的优化或处理。 比如,函数的基本形式是: def is_palindrome(s): return s == s[::-1] 但如果输入的s中包含空格或者标点,可能结果不对。比如输入"abba"返True,输入"abc cba"也返True。比如字符串中间有空格的情况,反转后是否包含空格?比如原字符串是"ab c",反转后是"cba",与原字符串不同。那这时候函数会返False。但如果用户希望将空格忽略,可能需要先处理字符串中的空格其他非字母数字字符。 所以这时候可能需要更多的处理步骤。例如,将字符串中的非字母数字字符过滤掉,转为小写,然后再比较。这时候,可以修改函数: def is_palindrome(s): # 预处理步骤 filtered = [ch.lower() for ch in s if ch.isalnum()] processed = &#39;&#39;.join(filtered) return processed == processed[::-1] 这样处理的话,像"A man, a plan, a canal: Panama"这样的字符串就会被确处理。但可能用户是否需要这个处理步骤? 这个时候,可能需要根据问题描述的意图来判断。如果题目中的回文串是严格的原字符串反转,那么不需要处理。否则,如果题目中的回文定义允许忽略非字母数字大小写,则需要预处理。 所以,作为答者,可能需要给出两种情况的解法,或者询问用户是否需要处理这些情况。但因为用户直接要求编写这个函数,可能希望得到一个比较通用的解法,所以可以给出两种版本,或者先给出基本版本,再说明可能的扩展。 比如,在答的时候,可以首先给出基本版本的代码,然后解释可能的优化点,比如处理大小写去除非字母数字字符。 现在,假设用户希望得到一个能够处理包含字母数字的字符串,忽略大小写其他字符的情况。例如,处理"A man, a plan, a canal: Panama"这样的字符串,这时候函数应该返True。 因此,确的处理步骤是: 1. 将字符串转换为全小写(或大写)。 2. 去除非字母数字的字符。 3. 判断处理后的字符串是否是回文。 那这样的Python函数应该怎么写? 首先,遍历每个字符,筛选出isalnum()为True的字符,然后转为小写。例如: s = "A man, a plan, a canal: Panama" filtered = [ch.lower() for ch in s if ch.isalnum()] processed = &#39;&#39;.join(filtered) # "amanaplanacanalpanama" 然后判断是否等于反转后的字符串。 所以,函数可以写成: def is_palindrome(s): processed = &#39;&#39;.join(ch.lower() for ch in s if ch.isalnum()) return processed == processed[::-1] 这样就能处理更复杂的情况。 但是,如果用户不需要这些处理步骤,可能只需要简单的比较原字符串反转后的字符串。那么可能两种方法都需要给出。 例如,先给出基本版本,然后给出考虑大小写非字母数字的版本。 那么,我应该如何答用户的问题? 用户的问题可能希望得到一个确的解法,所以需要综合考虑常见的情况。比如,在LeetCode中的题目,判断回文串通常需要处理这些情况。所以可能用户希望的是第二种更全面的解法。 所以,确的函数应该包含预处理步骤。因此,最终的代码应该是: def is_palindrome(s): s = &#39;&#39;.join(ch.lower() for ch in s if ch.isalnum()) return s == s[::-1] 然后测试几个例子: 例如,输入"abcba",返True;输入"A man...", 返True;输入"hello",返False。 另外,还需要考虑空字符串的情况。比如,如果s是空字符串或者处理后的字符串是空,比如全是符号,这时候返True,因为空字符串的反转也是空字符串。 比如,输入s = "!!!", 处理后的字符串是空,返True。但根据回文定义,空字符串是否算回文?可能要看题目要求。但一般处理中,空字符串回文。但可能需要确认。 或者,如果输入的s是None,或者不是字符串的情况?但题目中说输入字符,应该指的是字符串类型,所以函数假设输入的是字符串。 综上,确的函数应该包括预处理步骤,过滤非字母数字字符,统一小写,再判断是否回文。 所以,现在写出这个函数,并给出解释。</think>以下是一个判断字符串是否为回文串的 Python 函数,包含对特殊字符大小写的处理: ```python def is_palindrome(s): # 预处理:移除非字母数字字符并转为小写 processed = &#39;&#39;.join(ch.lower() for ch in s if ch.isalnum()) # 判断处理后的字符串是否等于其反转 return processed == processed[::-1] ``` ### 功能说明 1. **预处理** - `ch.lower()` 将所有字符转为小写(解决大小写敏感问题,如 `"AbbA"` 视为回文)。 - `ch.isalnum()` 过滤掉非字母、非数字字符(如空格、标点符号),仅保留有效字符。 2. **回文判断** 直接比较处理后的字符串与其反转后的结果是否一致。 --- ### 示例测试 ```python print(is_palindrome("A man, a plan, a canal: Panama")) # True print(is_palindrome("level")) # True print(is_palindrome("Hello")) # False print(is_palindrome("")) # True(空字符串视为回文) print(is_palindrome("12321")) # True ``` --- ### 基础版本(无预处理) 如果不需要处理特殊字符大小写,可以直接比较原字符串与反转字符串: ```python def is_palindrome_simple(s): return s == s[::-1] # 测试 print(is_palindrome_simple("abcba")) # True print(is_palindrome_simple("ab c")) # False(含空格时直接比较) print(is_palindrome_simple("AbbA")) # False(区分大小写) ``` 根据需求选择适合的版本即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值