leetcode
leetcode 401 ~ 450
寻找排列

寻找排列

难度:

标签:

题目描述

代码结果

运行时间: 33 ms, 内存: 17.0 MB


/*
 * Leetcode Problem 484: Find Permutation
 * The problem statement: Given a string s that consists of only 'I' (increase) and 'D' (decrease), find a permutation of the first n positive integers that satisfy the given input string s.
 * 
 * Approach using Java Streams:
 * 1. Create a list to represent the initial sequence from 1 to n+1.
 * 2. Use a loop to traverse the input string 's'.
 * 3. For each 'I', reverse the sequence of the numbers collected so far.
 * 4. For 'D', continue collecting the numbers.
 * 5. Convert the list to an array and return the result.
 */
 
import java.util.*;
import java.util.stream.*;
 
public class FindPermutationStream {
    public int[] findPermutation(String s) {
        int n = s.length();
        List<Integer> result = IntStream.rangeClosed(1, n + 1).boxed().collect(Collectors.toList());
 
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == 'I') {
                Collections.reverse(result.subList(0, i + 1));
            }
        }
        return result.stream().mapToInt(Integer::intValue).toArray();
    }
}
 

解释

方法:

这个题解的思路是通过拆分字符串 s,将其分成多个子字符串,每个子字符串以 'I' 为分隔。对于每个子字符串,生成一个降序的数字序列,序列的起始值为当前的 x 值加上子字符串的长度,终止值为 x。最后将所有生成的数字序列合并到结果列表中。

时间复杂度:

O(n)

空间复杂度:

O(n)

代码细节讲解

🦆
为什么在解法中选择以'I'作为分隔符来拆分字符串s?这与题目的要求和字符串的性质有什么特定的关联吗?
在这个问题中,字符串s由字符'I'和'D'组成,分别代表下一个数字应该比前一个数字大(递增)或小(递减)。使用'I'作为分隔符是因为每次遇到'I',都表示一个新的递增序列的开始。也就是说,'I'自然地将字符串分割为若干部分,每部分都是一个连续的递减序列(即D序列),使得每个部分都可以独立处理并生成降序数字序列。这种方法直接利用了字符串的性质来简化问题解决方案的实现。
🦆
生成降序数字序列时,起始值选择为x加上子字符串的长度,这种方法的正确性是基于什么逻辑?
选择起始值为x加上子字符串的长度是为了确保序列的数字能够正确地递减,并且与前面的数字序列连接时满足题目要求的大小关系。具体来说,x是当前子序列的起始数字,加上子字符串的长度意味着从当前位置起,考虑后续的'D'数量,确保生成的数字序列在连接前一个序列时能保持整体的递减顺序。这样做能确保每个数字都是唯一的,并且按照题目要求的顺序递减排列。
🦆
在更新x的值时,为什么要将长度加1?这里的+1具体是为了解决什么问题?
在更新x的值时,将长度加1是为了包含分隔字符'I'后的第一个递增位置。每次处理完一个子字符串后,x需要指向下一个新的子序列的起始数字。由于子字符串是以'I'结尾分割的,所以x的更新需要包括所有D字符的数量加上一个额外的1来跳过'I'本身,确保每个新的数字序列都从正确的位置开始。
🦆
题解中没有提到如何处理没有'I'的情况,例如全为'D'的字符串,这种情况下的处理逻辑是什么?
在没有'I'的情况下,整个字符串s可以被视为一个单独的子字符串。由于没有'I'作为分隔,这意味着整个序列应该是降序的。因此,可以直接从n(字符串长度加1)开始递减到1生成整个数字序列。这种情况下,起始值x为1,长度为s的长度,所以生成的序列将是从x+s长度即n开始,递减到x即1的序列。

相关问题