Welcome to Subscribe On Youtube
4030. Check ASCII Palindromic
Description
You are given a string s consisting of lowercase English letters.
Construct a binary string by replacing each character in s with the 8-bit binary representation of its ASCII value, including leading zeros, while preserving the original order of the characters.
Return true if the resulting binary string is a palindrome. Otherwise, return false.
Example 1:
Input: s = "ff"
Output: true
Explanation:
- The ASCII value of
fis 102, whose 8-bit binary representation is01100110. - Thus, the binary string is
0110011001100110. - Since this binary string is a palindrome, the output is
true.
Example 2:
Input: s = "leet"
Output: false
Explanation:
- The ASCII values of
l,e,e, andtare 108, 101, 101, and 116, respectively. - Their 8-bit binary representations are
01101100,01100101,01100101, and01110100. - Thus, the binary string is
01101100011001010110010101110100. - Since this binary string is not a palindrome, the output is
false.
Constraints:
1 <= s.length <= 100sconsists of lowercase English letters.
Solutions
Solution 1: Simulation
Thinking
Each character expands to a fixed $8$-bit string, including leading zeros, and we test whether the concatenation is a palindrome. $n$ is small enough that we need not rewrite the test in terms of character pairs.
Build $t$ in order and compare it with its reverse.
Following the problem statement, we replace each character of $s$ with the $8$-bit binary representation of its ASCII value (including leading zeros), concatenate them in order to obtain a binary string $t$, and then check whether $t$ is a palindrome.
The time complexity is $O(n)$ and the space complexity is $O(n)$, where $n$ is the length of $s$.
-
class Solution { public boolean isPalindromic(String s) { StringBuilder t = new StringBuilder(); for (char c : s.toCharArray()) { String b = Integer.toBinaryString(c); t.append("0".repeat(8 - b.length())).append(b); } return t.toString().equals(t.reverse().toString()); } } -
class Solution { public: bool isPalindromic(string s) { string t; for (unsigned char c : s) { for (int i = 7; i >= 0; --i) { t += char('0' + ((c >> i) & 1)); } } return ranges::equal(t, t | views::reverse); } }; -
class Solution: def isPalindromic(self, s: str) -> bool: t = ''.join(format(ord(c), '08b') for c in s) return t == t[::-1] -
func isPalindromic(s string) bool { var t []byte for _, c := range []byte(s) { for i := 7; i >= 0; i-- { t = append(t, '0'+((c>>i)&1)) } } for i := range t[:len(t)/2] { if t[i] != t[len(t)-1-i] { return false } } return true } -
function isPalindromic(s: string): boolean { const t = [...s].map(c => c.charCodeAt(0).toString(2).padStart(8, '0')).join(''); return t === [...t].reverse().join(''); }