回文串怎么编程

时间:2025-01-22 21:43:28 游戏攻略

回文串的编程可以通过多种方法实现,以下是一些常见的方法和代码示例:

方法一:双指针法

这种方法通过使用两个指针,一个从字符串的开头向中间移动,另一个从字符串的末尾向中间移动,比较对应位置的字符是否相同。如果所有对应位置的字符都相同,则该字符串是回文串。

```java

public class PalindromeChecker {

public static boolean isPalindrome(String s) {

int left = 0;

int right = s.length() - 1;

while (left < right) {

if (s.charAt(left) != s.charAt(right)) {

return false;

}

left++;

right--;

}

return true;

}

public static void main(String[] args) {

String s = "A man, a plan, a canal: Panama";

System.out.println(isPalindrome(s)); // 输出: true

}

}

```

方法二:反转字符串法

这种方法首先将字符串反转,然后与原字符串进行比较。如果反转后的字符串与原字符串相同,则原字符串是回文串。

```java

public class PalindromeChecker {

public static boolean isPalindrome(String s) {

String reversed = new StringBuilder(s).reverse().toString();

return s.equals(reversed);

}

public static void main(String[] args) {

String s = "A man, a plan, a canal: Panama";

System.out.println(isPalindrome(s)); // 输出: true

}

}

```

方法三:动态规划法

这种方法使用动态规划来检查字符串是否为回文串。动态规划数组`dp[i][j]`表示字符串从索引`i`到索引`j`的子串是否为回文串。

```java

public class PalindromeChecker {

public static boolean isPalindrome(String s) {

int n = s.length();

boolean[][] dp = new boolean[n][n];

// 单个字符是回文串

for (int i = 0; i < n; i++) {

dp[i][i] = true;

}

// 检查两个字符的子串

for (int i = 0; i < n - 1; i++) {

if (s.charAt(i) == s.charAt(i + 1)) {

dp[i][i + 1] = true;

}

}

// 检查长度大于2的子串

for (int length = 3; length <= n; length++) {

for (int i = 0; i <= n - length; i++) {

int j = i + length - 1;

if (s.charAt(i) == s.charAt(j) && dp[i + 1][j - 1]) {

dp[i][j] = true;

}

}

}

return dp[n - 1];

}

public static void main(String[] args) {

String s = "A man, a plan, a canal: Panama";

System.out.println(isPalindrome(s)); // 输出: true

}

}

```

方法四:构造回文串

这种方法通过构造回文串来解决问题。给定一个字符串`s`和一个整数`k`,构造一个长度为`k`的字符串`t`,使得`s + t`或`t + s`是回文串。

```python

def construct_palindrome(s, k):

if k % 2 == 0:

return s + s[:k // 2][::-1]

else:

return s + s[:k // 2][::-1] + s[k // 2]

示例

s = "abc"

k = 3

print(construct_palindrome(s, k)) 输出: "abccba"

```

这些方法各有优缺点,选择哪种方法取决于具体的应用场景和需求。双指针法和反转字符串法的时间复杂度为O(n),动态规划法的时间复杂度为O(n^2),而构造回文串的方法需要额外的空间来存储子串信息。