网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
11月09日漏签0天
c语言吧 关注:801,037贴子:4,370,218
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 12回复贴,共1页
<<返回c语言吧
>0< 加载中...

超时了有没有快一点的算法???

  • 取消只看楼主
  • 收藏

  • 回复
  • 讠朱仙
  • 团子家族
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

题目是

oj地址发楼下


  • 讠朱仙
  • 团子家族
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
//代码
#include<iostream>
#include<cmath>
#include<vector>
#include<string>
//#include<list>
using namespace std;
bool isrotate(string& s1, string& s2)
{
if (s1.size() != s2.size()) return false;
for (auto it = s2.begin(); it != s2.end(); it++)
{
string str1(s2.begin(), it);
string str2(it, s2.end());
if (s1 == (str1 + str2) || s1 == (str2 + str1))return true;
}
return false;
}
int main()
{
//测试代码
vector<string> words = { "abba", "abab", "baba", "abab", "baba", "bbaa", "aabb" };
//list<string> word(words.begin(),words.end());
//我用list报错,所以勉强用vector 做删除,但是vector 删除会让迭代器失效,所以我选择置空
vector<string> word;
auto it = words.begin();
while (it != words.end())
{
auto it2 = it;
it2++;
while (it2 != words.end())
{
if ( *it2!="" && isrotate(*it, *it2) ) {
//words.erase(it2++);
*it2 = "";
// continue;
}
it2++;
}
word.push_back(*it);
it++;
while ( it!=words.end() && *it == "")
it++;
}
cout << word.size() << endl;
return 0;
}


2025-11-09 08:00:16
广告
不感兴趣
开通SVIP免广告
  • 讠朱仙
  • 团子家族
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
题目翻译:旋转单词,如果两个单词是旋转单词那么他们属于同一旋转单词类,
求不同的旋转单词类的数量,
旋转单词: 不好描述就像例子那样


  • 讠朱仙
  • 团子家族
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
顶


  • 讠朱仙
  • 团子家族
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
http :/ / w w w .lintcode.c o m/zh-cn/problem /rotate-words/


  • 讠朱仙
  • 团子家族
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
最后一个测试数据至少5000个


  • 讠朱仙
  • 团子家族
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
顶一顶


  • 讠朱仙
  • 团子家族
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
再顶顶


2025-11-09 07:54:16
广告
不感兴趣
开通SVIP免广告
  • 讠朱仙
  • 团子家族
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我发的版本是先判断是否为循环单词,如果是就置空(删除,考虑到vector删除费时所以置空)然后所有遍历都跳过空字符,让words中每种单词只有一个,然后压入word中求其数量


  • 讠朱仙
  • 团子家族
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我在C++吧发的版本是,如果为循环单词则覆盖为前一个单词,交换到前一个被比较单词附近然后去重,(后来改为计数)


  • 讠朱仙
  • 团子家族
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
终于是搞好了


  • 讠朱仙
  • 团子家族
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
//通过代码
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
inline bool isrotate( const string& s1,const string& s2)
{
if (s1.size() != s2.size())return false;
int size = s1.size();
int i = 0;
int m = 0;
for (; m != size; m++)
{
if (s1[i] == s2[m]) i++;
else if (i != 0 && s1[i] != s2[m]) i = 0,m--;
}
if (i != 0)
{
m = 0;
for (; i != size; i++)
if (s1[i] == s2[m]) m++;
else break;
}
if (i == size) return true;
return false;
}
inline bool compare(const string& s1,const string& s2)
{
return s1.size() < s2.size();
}
int main()
{
//测试代码
vector<string> words = { "abba", "bbaa", "baab", "aabb", "abba" };
//list<string> words(word.begin(), word.end());不能用list
stable_sort(words.begin(), words.end(),compare);//oj的时候去掉这个
int i = 0;
for (auto it = words.begin(); it != words.end(); it++)
{
for (auto it2 = it + 1; it2 != words.end(); it2++)
{
if (it->size() != it2->size()) break;
if (isrotate(*it, *it2)) swap(*(++it),*it2);
}
i++;
}
cout << i << endl;
//return i;
return 0;
}


  • 讠朱仙
  • 团子家族
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
核心的函数就是isrotate
这个函数就写的很丑,不过全部是字符的比较,免去了大量重复的比较,所以还是很快的


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 12回复贴,共1页
<<返回c语言吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示