【发布时间】:2015-10-03 21:51:58
【问题描述】:
给定数字字符串,如“72388”和 int n,从字符串中删除 n 个字符,这样生成的字符串包含最小数字表示,您必须保留数字的相对位置。示例:如果 st="72388" 且 n=2,则答案为 238。
以下解决方案似乎不适用于所有情况。我们怎样才能将一个字符串减少到最小的字符串?
解决方案: 这里的想法是从左到右扫描删除一个字符,如果它大于字符串数组中的下一个字符和上一个字符。如果在迭代结束时删除的字符数小于“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;
}
}
【问题讨论】:
-
您是否有一个不在线性时间内运行的算法?
-
我实现的算法似乎不适用于特定情况。所以我不知道任何算法在所有情况下都能正常运行
-
你为什么不发布你目前的方法?
-
能否请您重新表述您的问题。我无法理解您在这里使用的逻辑是什么。