字符串分割

(100分)题目描述:字符串分割
【字符串分割】给定非空字符在s,将该字符串分割成一些子串,使每个子串的ASCII码值的和均为水仙花数。
1、若分割不成功则返回 0
2、若分割成功且分割结果不唯一则返回-1
3、若分割成功且分割结果唯一,则返回分割后的子串数目
输入描述: 1、输入字符串的最大长度为 200
输出描述:根据题目描述中情况返回相应的结果
备注:“水仙花数”是指一个三位数,每位上数字的立方和等于该数字本身,如 371是“水仙花数”,因为:371=3^3+7^3+1^3。
示例:
输入
abc
输出
0

参考代码:
/*
标题:字符串分割
【字符串分割】给定非空字符在s,将该字符串分割成一些子串,使每个子串的ASCIIA码值的和均为水仙花数。
1、若分割不成功则返回 0
2、若分割成功且分割结果不唯一则返回-1
3、若分割成功且分割结果唯一,则返回分割后的子串数目
输入描述: 1、输入字符串的最大长度为 200
输出描述:根据题目描述中情况返回相应的结果
备注:“水仙花数”是指一个三位数,每位上数字的立方和等于该数字本身,如 371是“水仙花数”,因为:371=3^3+7^3+1^3。
示例:
输入
abc
输出
0
*/
#include<bits/stdc++.h>
using namespace std;
void dfs(string& s, vector<string>& result, vector<vector<string>>& results);
bool isStr(string str);
int main()
{
	string input;
	getline(cin, input);
	vector<vector<string>> results;
	vector<string> result;
	dfs(input, result, results);
	if(results.size() == 0)
	{
		cout << results.size() << endl;
	}else if(results.size() == 1)
	{
		cout << results[0].size() << endl;
	}else
	{
		cout << -1 << endl;
	}
	system("pause");
	return 0;
}

void dfs(string& s,vector<string>& result,vector<vector<string>>& results)
{
	if(s.length() == 0 )
	{
		//此处已经分割到末尾,将分割后的字符串放入结果集中.
		results.push_back(result);
	}
	for (int i = 0; i < s.length(); i++)
	{
		//从头开始找字符串,判断是否是水仙花数
		string head = s.substr(0, i + 1);
		if(!isStr(head))
		{
			continue;
		}
		//已经切割了前面的水仙花,此处开始递归。
		string tail = s.substr(i + 1, s.length() - 1 - i);
		result.push_back(head);
		dfs(tail, result, results);
		//回溯
		result.pop_back();
	}
}

bool isStr(string str)
{
	int sum = 0;
	for (int i = 0; i < str.length(); i++)
	{
		sum = sum + str[i];
	}
	if(sum < 100 || sum > 999)
	{
		return false;
	}else
	{
		if (sum == pow(sum % 10, 3) + pow(((sum / 10) % 10), 3) + pow((sum / 100), 3))
		{
			return true;
		}
	}
	return false;
}








全部评论

相关推荐

点赞 评论 收藏
分享
程序员饺子:正常 我沟通了200多个 15个要简历 面试2个 全投的成都的小厂。很多看我是27直接不会了😅
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务