Skip to content

Commit 57cdbac

Browse files
authored
feat: add solutions to lc problem: No.1842 (doocs#2127)
No.1842.Next Palindrome Using Same Digits
1 parent 2c6d560 commit 57cdbac

File tree

7 files changed

+457
-2
lines changed

7 files changed

+457
-2
lines changed

solution/1800-1899/1842.Next Palindrome Using Same Digits/README.md

+159-1
Original file line numberDiff line numberDiff line change
@@ -51,22 +51,180 @@
5151

5252
<!-- 这里可写通用的实现逻辑 -->
5353

54+
**方法一:求前一半的下一个排列**
55+
56+
根据题目描述,我们只需要求出前一半的下一个排列,然后遍历前一半,对称赋值后半部分即可。
57+
58+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为字符串长度。
59+
5460
<!-- tabs:start -->
5561

5662
### **Python3**
5763

5864
<!-- 这里可写当前语言的特殊实现逻辑 -->
5965

6066
```python
61-
67+
class Solution:
68+
def nextPalindrome(self, num: str) -> str:
69+
def next_permutation(nums: List[str]) -> bool:
70+
n = len(nums) // 2
71+
i = n - 2
72+
while i >= 0 and nums[i] >= nums[i + 1]:
73+
i -= 1
74+
if i < 0:
75+
return False
76+
j = n - 1
77+
while j >= 0 and nums[j] <= nums[i]:
78+
j -= 1
79+
nums[i], nums[j] = nums[j], nums[i]
80+
nums[i + 1 : n] = nums[i + 1 : n][::-1]
81+
return True
82+
83+
nums = list(num)
84+
if not next_permutation(nums):
85+
return ""
86+
n = len(nums)
87+
for i in range(n // 2):
88+
nums[n - i - 1] = nums[i]
89+
return "".join(nums)
6290
```
6391

6492
### **Java**
6593

6694
<!-- 这里可写当前语言的特殊实现逻辑 -->
6795

6896
```java
97+
class Solution {
98+
public String nextPalindrome(String num) {
99+
char[] nums = num.toCharArray();
100+
if (!nextPermutation(nums)) {
101+
return "";
102+
}
103+
int n = nums.length;
104+
for (int i = 0; i < n / 2; ++i) {
105+
nums[n - 1 - i] = nums[i];
106+
}
107+
return String.valueOf(nums);
108+
}
109+
110+
private boolean nextPermutation(char[] nums) {
111+
int n = nums.length / 2;
112+
int i = n - 2;
113+
while (i >= 0 && nums[i] >= nums[i + 1]) {
114+
--i;
115+
}
116+
if (i < 0) {
117+
return false;
118+
}
119+
int j = n - 1;
120+
while (j >= 0 && nums[i] >= nums[j]) {
121+
--j;
122+
}
123+
swap(nums, i++, j);
124+
for (j = n - 1; i < j; ++i, --j) {
125+
swap(nums, i, j);
126+
}
127+
return true;
128+
}
129+
130+
private void swap(char[] nums, int i, int j) {
131+
char t = nums[i];
132+
nums[i] = nums[j];
133+
nums[j] = t;
134+
}
135+
}
136+
```
137+
138+
### **C++**
139+
140+
```cpp
141+
class Solution {
142+
public:
143+
string nextPalindrome(string num) {
144+
int n = num.size();
145+
string nums = num.substr(0, n / 2);
146+
if (!next_permutation(begin(nums), end(nums))) {
147+
return "";
148+
}
149+
for (int i = 0; i < n / 2; ++i) {
150+
num[i] = nums[i];
151+
num[n - i - 1] = nums[i];
152+
}
153+
return num;
154+
}
155+
};
156+
```
157+
158+
### **Go**
159+
160+
```go
161+
func nextPalindrome(num string) string {
162+
nums := []byte(num)
163+
n := len(nums)
164+
if !nextPermutation(nums) {
165+
return ""
166+
}
167+
for i := 0; i < n/2; i++ {
168+
nums[n-1-i] = nums[i]
169+
}
170+
return string(nums)
171+
}
172+
173+
func nextPermutation(nums []byte) bool {
174+
n := len(nums) / 2
175+
i := n - 2
176+
for i >= 0 && nums[i] >= nums[i+1] {
177+
i--
178+
}
179+
if i < 0 {
180+
return false
181+
}
182+
j := n - 1
183+
for j >= 0 && nums[j] <= nums[i] {
184+
j--
185+
}
186+
nums[i], nums[j] = nums[j], nums[i]
187+
for i, j = i+1, n-1; i < j; i, j = i+1, j-1 {
188+
nums[i], nums[j] = nums[j], nums[i]
189+
}
190+
return true
191+
}
192+
```
69193

194+
### **TypeScript**
195+
196+
```ts
197+
function nextPalindrome(num: string): string {
198+
const nums = num.split('');
199+
const n = nums.length;
200+
if (!nextPermutation(nums)) {
201+
return '';
202+
}
203+
for (let i = 0; i < n >> 1; ++i) {
204+
nums[n - 1 - i] = nums[i];
205+
}
206+
return nums.join('');
207+
}
208+
209+
function nextPermutation(nums: string[]): boolean {
210+
const n = nums.length >> 1;
211+
let i = n - 2;
212+
while (i >= 0 && nums[i] >= nums[i + 1]) {
213+
i--;
214+
}
215+
if (i < 0) {
216+
return false;
217+
}
218+
let j = n - 1;
219+
while (j >= 0 && nums[i] >= nums[j]) {
220+
j--;
221+
}
222+
[nums[i], nums[j]] = [nums[j], nums[i]];
223+
for (i = i + 1, j = n - 1; i < j; ++i, --j) {
224+
[nums[i], nums[j]] = [nums[j], nums[i]];
225+
}
226+
return true;
227+
}
70228
```
71229

72230
### **...**

solution/1800-1899/1842.Next Palindrome Using Same Digits/README_EN.md

+159-1
Original file line numberDiff line numberDiff line change
@@ -45,18 +45,176 @@
4545

4646
## Solutions
4747

48+
**Solution 1: Find the Next Permutation of the First Half**
49+
50+
According to the problem description, we only need to find the next permutation of the first half of the string, then traverse the first half and symmetrically assign values to the second half.
51+
52+
The time complexity is $O(n)$, and the space complexity is $O(n)$. Where $n$ is the length of the string.
53+
4854
<!-- tabs:start -->
4955

5056
### **Python3**
5157

5258
```python
53-
59+
class Solution:
60+
def nextPalindrome(self, num: str) -> str:
61+
def next_permutation(nums: List[str]) -> bool:
62+
n = len(nums) // 2
63+
i = n - 2
64+
while i >= 0 and nums[i] >= nums[i + 1]:
65+
i -= 1
66+
if i < 0:
67+
return False
68+
j = n - 1
69+
while j >= 0 and nums[j] <= nums[i]:
70+
j -= 1
71+
nums[i], nums[j] = nums[j], nums[i]
72+
nums[i + 1 : n] = nums[i + 1 : n][::-1]
73+
return True
74+
75+
nums = list(num)
76+
if not next_permutation(nums):
77+
return ""
78+
n = len(nums)
79+
for i in range(n // 2):
80+
nums[n - i - 1] = nums[i]
81+
return "".join(nums)
5482
```
5583

5684
### **Java**
5785

5886
```java
87+
class Solution {
88+
public String nextPalindrome(String num) {
89+
char[] nums = num.toCharArray();
90+
if (!nextPermutation(nums)) {
91+
return "";
92+
}
93+
int n = nums.length;
94+
for (int i = 0; i < n / 2; ++i) {
95+
nums[n - 1 - i] = nums[i];
96+
}
97+
return String.valueOf(nums);
98+
}
99+
100+
private boolean nextPermutation(char[] nums) {
101+
int n = nums.length / 2;
102+
int i = n - 2;
103+
while (i >= 0 && nums[i] >= nums[i + 1]) {
104+
--i;
105+
}
106+
if (i < 0) {
107+
return false;
108+
}
109+
int j = n - 1;
110+
while (j >= 0 && nums[i] >= nums[j]) {
111+
--j;
112+
}
113+
swap(nums, i++, j);
114+
for (j = n - 1; i < j; ++i, --j) {
115+
swap(nums, i, j);
116+
}
117+
return true;
118+
}
119+
120+
private void swap(char[] nums, int i, int j) {
121+
char t = nums[i];
122+
nums[i] = nums[j];
123+
nums[j] = t;
124+
}
125+
}
126+
```
127+
128+
### **C++**
129+
130+
```cpp
131+
class Solution {
132+
public:
133+
string nextPalindrome(string num) {
134+
int n = num.size();
135+
string nums = num.substr(0, n / 2);
136+
if (!next_permutation(begin(nums), end(nums))) {
137+
return "";
138+
}
139+
for (int i = 0; i < n / 2; ++i) {
140+
num[i] = nums[i];
141+
num[n - i - 1] = nums[i];
142+
}
143+
return num;
144+
}
145+
};
146+
```
147+
148+
### **Go**
149+
150+
```go
151+
func nextPalindrome(num string) string {
152+
nums := []byte(num)
153+
n := len(nums)
154+
if !nextPermutation(nums) {
155+
return ""
156+
}
157+
for i := 0; i < n/2; i++ {
158+
nums[n-1-i] = nums[i]
159+
}
160+
return string(nums)
161+
}
162+
163+
func nextPermutation(nums []byte) bool {
164+
n := len(nums) / 2
165+
i := n - 2
166+
for i >= 0 && nums[i] >= nums[i+1] {
167+
i--
168+
}
169+
if i < 0 {
170+
return false
171+
}
172+
j := n - 1
173+
for j >= 0 && nums[j] <= nums[i] {
174+
j--
175+
}
176+
nums[i], nums[j] = nums[j], nums[i]
177+
for i, j = i+1, n-1; i < j; i, j = i+1, j-1 {
178+
nums[i], nums[j] = nums[j], nums[i]
179+
}
180+
return true
181+
}
182+
```
59183

184+
### **TypeScript**
185+
186+
```ts
187+
function nextPalindrome(num: string): string {
188+
const nums = num.split('');
189+
const n = nums.length;
190+
if (!nextPermutation(nums)) {
191+
return '';
192+
}
193+
for (let i = 0; i < n >> 1; ++i) {
194+
nums[n - 1 - i] = nums[i];
195+
}
196+
return nums.join('');
197+
}
198+
199+
function nextPermutation(nums: string[]): boolean {
200+
const n = nums.length >> 1;
201+
let i = n - 2;
202+
while (i >= 0 && nums[i] >= nums[i + 1]) {
203+
i--;
204+
}
205+
if (i < 0) {
206+
return false;
207+
}
208+
let j = n - 1;
209+
while (j >= 0 && nums[i] >= nums[j]) {
210+
j--;
211+
}
212+
[nums[i], nums[j]] = [nums[j], nums[i]];
213+
for (i = i + 1, j = n - 1; i < j; ++i, --j) {
214+
[nums[i], nums[j]] = [nums[j], nums[i]];
215+
}
216+
return true;
217+
}
60218
```
61219

62220
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
class Solution {
2+
public:
3+
string nextPalindrome(string num) {
4+
int n = num.size();
5+
string nums = num.substr(0, n / 2);
6+
if (!next_permutation(begin(nums), end(nums))) {
7+
return "";
8+
}
9+
for (int i = 0; i < n / 2; ++i) {
10+
num[i] = nums[i];
11+
num[n - i - 1] = nums[i];
12+
}
13+
return num;
14+
}
15+
};

0 commit comments

Comments
 (0)