题解 | #小红的字符串构造#

小红的字符串构造

https://www.nowcoder.com/practice/3e4b4dabc2e444e384c3ae62ac7dd84e

解题思路

这是一个字符串构造问题,要求构造的新字符串t在每个位置上都和原字符串s不同,但使用的字符集必须相同。
解题思路如下:

  1. 首先获取原字符串s的字符集(去重后的所有字符)
  2. 如果字符集大小为1,则无法构造(因为每个位置都必须不同)
  3. 对于字符集大小≥2的情况,把当前字符变为字符集内位置的下一位

代码

#include <iostream>
#include <string>
#include <set>
#include <vector>
#include <algorithm>
using namespace std;
int main(void)
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	string s;
	cin>>s;
	set<char> chk(s.begin(),s.end());
	vector<char> v(chk.begin(),chk.end());
	int m=v.size(),w;
	if(m==1)
	{
		cout<<"-1";
		return 0;
	}
	for(char &c:s)
	{
		w=find(v.begin(),v.end(),c)-v.begin();
		cout<<v[(w+1)%m];
	}
	return 0;
}
import java.util.*;
public class ZT6 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s=sc.next();
        int n=s.length(),m,i,w;
        Set<Character> chk=new HashSet();
        for(i=0;i<n;++i)
            chk.add(s.charAt(i));
        ArrayList<Character> v=new ArrayList(chk);
        m=v.size();
        if(m==1)
            System.out.println(-1);
        else{
            for(i=0;i<n;++i){
                w=v.indexOf(s.charAt(i));
                System.out.print(v.get((w+1)%m));
            }
        }
    }
}

s=input()
v=list(set(s))
m=len(v)
if(m==1):
    print(-1)
else:
    for i in s:
        w=v.index(i)
        print(v[(w+1)%m],end='')

算法及复杂度

  • 算法:构造法。使用字符集中的字符交替构造新字符串。
  • 时间复杂度: ,其中n为字符串长度。
  • 空间复杂度: ,其中k为字符集大小,一般不超过26。
全部评论

相关推荐

要冲外企的祖国花朵很温柔:今年有签约礼盒嘛
点赞 评论 收藏
分享
2024-11-04 02:04
门头沟学院 产品经理
柴花:看到学长学姐躺的这么彻底也是放心了😅幸好我还一手抓着考研,还能混几年,不然真要上街打野去了。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务