c++ - 反转字符串中单词的位置而不改变 O(1) 空间限制中特殊字符的顺序
问题描述
在模拟面试中,我提出了这个问题。面试官首先问这个问题,没有任何空间限制。然后他继续使用空间有限的版本。要在同一页面上。在问题中,给出了由分隔符组成的字符串和容器类。这取决于您决定合适的容器类和响应语言。我认为样本输入和输出足以理解真正的问题是什么。
输入:
"Reverse#Strings Without%Changing-Delimiters"
输出:
"Delimiters#Changing Without%Strings-Reverse"
注意:“#”、“%”、“”-”的位置不变
我想出了以下解决方案:
string ChangeOrderWithoutSpecial(string s, unordered_set<char> delimiter)
{
stack<string> words; // since last words outs first
queue<char> limiter; // since first delimiter outs first
string response =""; //return value
int index=-1; // index of last delimiter visited
int len=s.length();
for (int i =0 ; i <len;i++)
{
if(delimiter.find(s[i]) != delimiter.end()) // i-th char is a delimiter character
{
string temp=s.substr(index+1,i-index-1);
words.push(temp);
char t =s.at(i);
limiter.push(t);
index=i;
}
// i realized that part after interview under assumption starting with word and no double delimiters ie, each word followed by one delimiter
if(index!=s.length()-1)
{
string temp=s.substr(index+1,s.length()-index-1);//until the end;
cout<<temp<<endl;
words.push(temp);
}
while(!limiter.empty())
{
response+=words.top()+limiter.front();
words.pop();
limiter.pop();
}
response+=words.top();
return response;
}
但是我找不到 ao(1) 空间解决方案?有谁知道怎么做?我也无法弄清楚是否有多个分隔符,这也适用。谢谢有人花时间阅读。
解决方案
找到第一个单词和最后一个单词。将字符串旋转length(last_word)-length(first_word)
: 这会将中间部分放在正确的位置。在示例中,这将产生
ersReverse#Strings Without%Changing-Delimit
然后旋转字符串的第一部分和最后一部分,跳过中间部分length(first_word)
:
Delimiters#Strings Without%Changing-Reverse
对两个最外层分隔符之间的子字符串重复此算法。
“Rotate by m
”操作可以在O(1)
空间和O(n)
时间上进行,其中n
是被旋转序列的长度。
推荐阅读
- mapbox - 如何将带有旋转的图标图像添加到静态 MapBox 图像?
- javascript - jquery on(click) 每次点击,信息取自第一个元素
- html - 我的 h1 元素的文本比元素的实际高度短。我可以删除空白空间吗?
- node.js - 改进 mongoose find() 查询执行时间
- python - 字符串列上的雾索引
- python - libvlc - http 流错误:本地流 1 错误:取消 (0x8)
- node.js - NodeJS 上的 FortiClient
- flutter - 在颤振运行期间收到多条错误消息(与 gradle 相关)
- java - 在编写junit测试用例时在Spring Webflux中自动装配ApplicationContext
- java - XMLBeans 无法加载 SchemaTypeSystem。无法加载名为 schemaorg_apache_xmlbeans.system 的类