最小值字符串

时间:2015-10-03 21:51:58

标签: c arrays string algorithm

给出一串数字,如" 72388"和int n,从sting中删除n个字符,使得结果字符串包含最小数字表示,您必须保留数字的相对位置。例如:如果st =" 72388"并且n = 2,答案是238。

以下解决方案似乎并不适用于所有情况。我们如何将字符串减少到最小字符串?

解决方案: 这里的想法是从左到右扫描如果它大于字符串数组中的下一个字符和prev char,则删除一个字符。如果删除的字符数小于' n'在迭代结束时,重复从字符串的结尾到开始的相同迭代。

char *
min_string(char *str, int n)
{
static char buf[100] = "";
int len = strlen(str);
int k = -1;
int count = 0;
int i;
char prev, curr, next;

if(len == 0 || len < n)
return -1;

if(len == n)
return 0;

prev = str[0];
for(i=1; i<len-1 && count<=n; i++)
{
curr = str[i];
next = str[i+1];
if(curr > next && curr > prev)
{
    count++;
    continue;
}
else if(curr < next && curr <= prev)
{
    count++;
    prev = curr;
    buf[k] = curr;
}
else
{
    buf[++k] = curr;
}
}

if(count < n)
{
count = 0;
k = len - n;
prev = buf[k - 1] = str[len-1];
for(i=len-2; i>0; i--)
{
    curr = str[i];
    next = str[i-1];
    if(curr > next && curr > prev)
    {
    count++;
    continue;
    }
    else if(curr < next && curr <= prev)
    {
    count++;
    prev = curr;
    buf[k] = curr;
    }
    else
    {
    buf[--k] = curr;
    }
}

printf("Resulted string     :   %s\n", buf);
return buf;
}
else
{
for(; i<len; i++)
{
    buf[++k] = str[i];
}

printf("Resulted string ascending   :   %s\n", buf);
return buf;
}
}

1 个答案:

答案 0 :(得分:0)

我会提供一些提示,以免破坏乐趣:

删除顺序不会影响结果。因此,每次删除使数字尽可能小的数字时,您可以逐个删除数字。

要删除的数字将是最左边的数字,大于其后继者。

如果没有这样的数字,则数字会增加,而删除的数字则是最后一位。