[leetcode]484.Find Permutation

来源:互联网 发布:agile java pdf 编辑:程序博客网 时间:2024/06/06 20:52

greedy

题目:

By now, you are given a secret signature consisting of character ‘D’ and ‘I’. ‘D’ represents a decreasing relationship between two numbers, ‘I’ represents an increasing relationship between two numbers. And our secret signature was constructed by a special integer array, which contains uniquely all the different number from 1 to n (n is the length of the secret signature plus 1). For example, the secret signature “DI” can be constructed by array [2,1,3] or [3,1,2], but won’t be constructed by array [3,2,4] or [2,1,3,4], which are both illegal constructing special string that can’t represent the “DI” secret signature.
On the other hand, now your job is to find the lexicographically smallest permutation of [1, 2, … n] could refer to the given secret signature in the input.

Example 1:

Input: "I"Output: [1,2]Explanation: [1,2] is the only legal initial spectial string can construct secret signature "I", where the number 1 and 2 construct an increasing relationship.

Example 2:

Input: "DI"Output: [2,1,3]Explanation: Both [2,1,3] and [3,1,2] can construct the secret signature "DI", but since we want to find the one with the smallest lexicographical permutation, you need to output [2,1,3]

Note:
The input string will only contain the character ‘D’ and ‘I’.
The length of input string is a positive integer and will not exceed 10,000

给定一个只包含字符’D’和’I’的字符串s。’D’表示递减,’I’表示递增。根据s构造数字1到n的一个排列,使得排列的字典序最小,并且相邻两数字之间的关系与s中的字符保持一致。

思路:

只有D相邻的两个位置的数需要互换,因此,通过确定D的个数和每段只含有D的字符串的起始位置,就可以确定需要翻转的数组的长度及位置。设D的起始位置是i,且str[i] != D,向下遍历字符串,直到str[j+1] = D,j+1 < str.size(),则D的长度为j-i+1,因此将区间[i+1, j+2]的数翻转。

代码:

vector<int> find(string str) {    int size = str.size();    vector<int> res(size+1);    int i, j, k;    for (i = 0; i < size; i++) {        if (str[i] == 'D') {            j = i;            while(str[j] == 'D' && j < size) j++;            reverse(res.begin()+i+1, res.begin()+j+2);            i = j;        }    }    return res;}
原创粉丝点击