艾迪设计了一个字符串编码算法,把一个字符串S编码为另一个字符串,本题字符串中的字符均为a-z的小写字母。
他设计了一个函数FS(c),将该字符串S的某个字符c映射为另一个字符。该函数定义为:
FS(c)=chr(G(c,S))
其中G(c,S)表示字符c在字符串S中最后一次出现的位置后面不重复字符的个数。例如若S="abcaedef",则G(′a′,S)=3,因为字符'a'在S中最后一次出现的位置是3,该位置后有4个字符,但有2个'e',故不重复的字符为3个,即'e'、'd'和'f'。函数chr(i)为第i+1个小写字母,例如chr(0)=′a′, chr(1)=′b′, chr(25)=′z′。故对于S="abcaedef"有FS(′a′)=chr(G(′a′,S))=chr(3)=′d′。
艾迪的编码算法即:依次将S中的每一个字符c替换为FS(c)。例如"abc"对应的编码为"cba",因为'a'在字符串最后一次出现的位置后面有2个不重复的字符'b' 和'c',故其FS值为第3个小写字母'c';'b'在字符串最后一次出现的位置后面有1个不重复的字符'c',故其FS值为第2个小写字母'b';'c'在字符串最后一次出现的位置后面有0个字符,故其FS值为第1个小写字母'a'。同理,"aacc"的编码为"bbaa","cac" 的编码为"aba"。
现给定一个字符串,请基于艾迪的算法编写程序,输出其编码后的字符串。
输入格式:
输入为一个字符串S。字符串长度不超过105。字符串中的字符为a-z的小写字母。
输出格式:
输出一个字符串,表示编码后的字符串。
输入样例1:
aca
输出样例1:
aba
挺有意思,其实主要是写G(c,s)函数,可以从字符串右侧开始统计字符个数,定义一个长度为26的整型数组,初始化为0。,遇到'a',则第0个元素值设置为1,最后数一下26个元素中有多少个1,或者累加结果即可。
#include <stdio.h>
#include <string.h>
int G(char c,char *S)
{
int a[26] = {0},num=0;
int len = strlen(S);
for(int i=len-1;i>=0;i--)
{
if(S[i] != c)
{
if(a[S[i]-'a'] == 0)
{
num++;
a[S[i]-'a'] = 1;
}
}
else
break;
}
return num;
}
char FS(char c,char *S)
{
return 'a' + G(c,S);
}
int main()
{
char a[106] = {0};
gets(a);
int i=0;
while(a[i] != '\0')
{
a[i] = FS(a[i],a);
i++;
}
printf("%s\n",a);
return 0;
}
#include<iostream>
#include<string.h>
using namespace std;
char s[110]; //保存字符串
int ton1[27]; //ton1 保存是否是最后一个
int main()
{
cin >> s;
int len = strlen(s);
for(int i = len - 1 , diff = 1;i >= 0;i --)
{
if(ton1[s[i] - 'a'] == 0)
{
ton1[s[i] - 'a'] = diff;
diff ++;
}
}
for(int i = 0;i < len;i ++)
s[i] = ton1[s[i] - 'a'] + 'a' - 1;
cout << s;
}