125. Valid Palindrome
Фраза является палиндромом, если после преобразования всех заглавных букв в строчные и удаления всех неалфавитно-цифровых символов она читается одинаково как слева направо, так и справа налево. Алфавитно-цифровые символы включают в себя буквы и цифры.
Для данной строки s return true, если она является палиндромом, и false в противном случае.
例:
Input: s = "A man, a plan, a canal: Panama"
Output: true
Explanation: "amanaplanacanalpanama" is a palindrome.
C# 解法
照合済み/オリジナルpublic class Solution {
public bool IsPalindrome(string s) {
int i = 0;
int j = s.Length - 1;
while (i < j) {
while (i < j && !Char.IsLetterOrDigit(s[i])) {
i++;
}
while (i < j && !Char.IsLetterOrDigit(s[j])) {
j--;
}
if (char.ToLower(s[i]) != char.ToLower(s[j]))
return false;
i++;
j--;
}
return true;
}
}
C++ 解法
自動ドラフト、提出前に確認#include <bits/stdc++.h>
using namespace std;
// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
public bool IsPalindrome(string s) {
int i = 0;
int j = s.size() - 1;
while (i < j) {
while (i < j && !Char.IsLetterOrDigit(s[i])) {
i++;
}
while (i < j && !Char.IsLetterOrDigit(s[j])) {
j--;
}
if (char.ToLower(s[i]) != char.ToLower(s[j]))
return false;
i++;
j--;
}
return true;
}
}
Java 解法
照合済み/オリジナルclass Solution {
public boolean isPalindrome(String s) {
for (int i = 0, j = s.length() - 1; i < j; i++, j--) {
while (i < j && !Character.isLetterOrDigit(s.charAt(i))) {
i++;
}
while (i < j && !Character.isLetterOrDigit(s.charAt(j))) {
j--;
}
if (
Character.toLowerCase(s.charAt(i)) !=
Character.toLowerCase(s.charAt(j))
) return false;
}
return true;
}
}
JavaScript 解法
照合済み/オリジナルvar isPalindrome = function (s) {
let i = 0;
let j = s.length - 1;
while (i < j) {
while (i < j && !isLetterOrDigit(s[i])) {
i++;
}
while (i < j && !isLetterOrDigit(s[j])) {
j--;
}
if ((s[i] + "").toLowerCase() !== (s[j] + "").toLowerCase())
return false;
i++;
j--;
}
return true;
};
function isLetterOrDigit(character) {
const charCode = character.charCodeAt();
return (
(charCode >= "a".charCodeAt() && charCode <= "z".charCodeAt()) ||
(charCode >= "A".charCodeAt() && charCode <= "Z".charCodeAt()) ||
(charCode >= "0".charCodeAt() && charCode <= "9".charCodeAt())
);
}
Python 解法
照合済み/オリジナルclass Solution:
def isPalindrome(self, s: str) -> bool:
i, j = 0, len(s) - 1
while i < j:
while i < j and not s[i].isalnum():
i += 1
while i < j and not s[j].isalnum():
j -= 1
if s[i].lower() != s[j].lower():
return False
i += 1
j -= 1
return True
Go 解法
照合済み/オリジナルfunc isPalindrome(s string) bool {
i := 0
j := len(s) - 1
for i < j {
for i < j && !isalnum(s[i]) {
i++
}
for i < j && !isalnum(s[j]) {
j--
}
if tolower(s[i]) != tolower(s[j]) {
return false
}
i++
j--
}
return true
}
func isalnum(c byte) bool {
return ('0' <= c && c <= '9') || ('a' <= c && c <= 'z') ||
('A' <= c && c <= 'Z')
}
func tolower(c byte) byte {
if 'A' <= c && c <= 'Z' {
return c - 'A' + 'a'
}
return c
}
Algorithm
1️⃣
Поскольку 入力ная 文字列 содержит символы, которые нам нужно игнорировать при проверке на палиндром, становится трудно определить реальную середину нашего палиндромического ввода.
2️⃣
Вместо того, чтобы двигаться от середины наружу, мы можем двигаться внутрь к середине! Если начать перемещаться внутрь, с обоих концов 入力ной строки, мы можем ожидать увидеть те же символы в том же порядке.
3️⃣
Результирующий アルゴリズム прост:
1. Установите два указателя, один на каждом конце 入力ной строки.
2. Если ввод является палиндромом, оба указателя должны указывать на эквивалентные символы в любой момент времени.
3. Если это 問題文 не выполняется в какой-либо момент времени, мы прерываемся и возвращаемся раньше.
4. Мы можем просто игнорировать неалфавитно-цифровые символы, продолжая двигаться дальше.
5. Продолжайте перемещение внутрь, пока указатели не встретятся в середине.
😎
Vacancies for this task
有効な求人 with overlapping task tags are 表示.