- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编写一个函数,它接受一个字符串和每个字符,并返回到字符串中最近的元音的距离。如果字符本身是元音,则返回 0,但是当我不知道我的代码有什么问题时,因为我的 s vector (包含答案的所有值)中的前两个元素正在工作。其余的只是返回 0。我做错了什么?
#include <iostream>
#include<vector>
#include<algorithm>
std::vector<int> distance(std::string word){
std::vector<char> r = {'a', 'e', 'i', 'o', 'u'};
std::vector<int> s(word.length());
for(int i = 0; i < word.length(); i++){
if(std::find(r.begin(), r.end(), word[i]) == r.end()){
for(int c = i + 1, d = i - 1; c < word.length() || d > 0; c++, d--){
if(std::find(r.begin(), r.end(), word[c]) != r.end()){
s[i] = c - i;
break;
}
else if(d >= 0 && std::find(r.begin(), r.end(), word[d]) != r.end()){
s[i] = i - d;
break;
}
}
}else s[i] = 0;
}
return s;
}
int main() {
std::vector<int> h = distance("abbb");
for(auto c : h){
std::cout<<c<<"\n";
}
}
最佳答案
现代 C++ 中算法和有状态 Lambda 的强大功能。 . .
请先看O(2n)计算结果的代码:
#include <iostream>
#include <algorithm>
#include <iterator>
#include <vector>
#include <string>
// Function to calculate the distance to the nearest vowel
auto distanceToNextVowel(const std::string& s) {
// Lambda to calculate if a character is a vowel
auto isVowel = [](char c) { return (0x208222 >> (c & 0x1f)) & 1; };
// Here we will store the resulting distance
std::vector<size_t> dist(s.size());
// Calculate distance from left and from right and use minimum
std::transform(s.begin(), s.end(), dist.begin(), [&, i = s.size()](const char c) mutable { if (isVowel(c)) i = 0; else ++i; return i; });
std::transform(s.rbegin(), s.rend(), dist.rbegin(), dist.rbegin(), [&, i = s.size()](const char c, const size_t s) mutable { if (isVowel(c)) i = 0; else ++i; return std::min(i, s); });
// Return result to caller
return dist;
}
// Test Driver
int main() {
// This is our test string
const std::string test{"Hello World"};
// Caclcuate Result
const auto dist = distanceToNextVowel(test);
// Show result on console
std::copy(test.begin(), test.end(), std::ostream_iterator<char>(std::cout, "\t")); std::cout << '\n';
std::copy(dist.begin(), dist.end(), std::ostream_iterator<size_t>(std::cout, "\t")); std::cout << '\n';
return 0;
}
呃呃!?那是什么?
这表明在 C++ 中可以解决多么美妙的问题。但是,它需要很多解释。首先,如何检查字符是否为元音。
如果我们使用ASCII码对字母进行编码,那么我们会看到如下内容:
我们看到大写字母和小写字母的 ASCII 码只是低 5 位不同。所以,如果我们用 0x1F 屏蔽 ASCII 码,那么 char c{'a'}; unsigned int x{c & 0x1F}
,我们将得到 1 到 26 之间的值。因此,我们可以为每个字母计算一个 5 位的值。如果我们现在用 1 标记所有元音,我们可以构建一个由 32 位(无符号整数)组成的二进制数,并在元音为真的每个位置设置一个位。然后我们得到类似的东西
Bit position
3322 2222 2222 1111 1111 1100 0000 0000
1098 7654 3210 9876 5432 1098 7654 3210
Position with vowels:
0000 0000 0010 0000 1000 0010 0010 0010
这个数字可以转换为 0x208222。如果我们现在想知道,如果一个字母(不管是大写还是小写)是元音,那么我们从字符( C & 1F )中屏蔽掉不需要的位,并将二进制数向右移动尽可能多位置,作为生成的字母代码。如果该位设置在 LSB 位置,则我们有一个元音。这知道如何已有数十年历史。
啊哈。不太容易,但适用于 ASCII 编码的字母。
顺便说一下,它也适用于其他字符选择。
生成的 Lambda 很简单:
auto isVowel = [](char c) { return (0x208222 >> (c & 0x1f)) & 1; };
很酷。 . .
接下来,如何计算与下一个元音的距离。
让我们开始思考。如果我们从左到右遍历字符串,那么如果我们找到元音,我们将结果索引位置设置为 0。然后,我们简单地计算每个辅音,直到我们击中下一个元音。这将适用于从左到右计数。如果字符串不是以元音开头,那么我们使用一些大的指示数字,例如 999,因为在这个方向上没有距离。示例:
H e l l o W o r l d
999 0 1 2 0 1 2 0 1 2 3
接下来,如果我们从右到左使用完全相同的算法,那么我们会得到:
H e l l o W o r l d
1 0 2 1 0 2 1 0 999 999 999
而最小距离,无论是从左还是从右,都是相应值中的最小值,无论是从左还是从右。所以
String: H e l l o W o r l d
Left: 999 0 1 2 0 1 2 0 1 2 3
Right: 1 0 2 1 0 2 1 0 999 999 999
Min of above: 1 0 1 1 0 1 1 0 1 2 3
最后一行是结果。
现在,我们将使用有状态的 Lambda 来计算第一行:
std::transform(s.begin(), s.end(), dist.begin(), [&, i = s.size()](const char c) mutable { if (isVowel(c)) i = 0; else ++i; return i; });
因此,我们将遍历整个字符串。从左到右。如果我们找到一个元音,我们将距离设置为 0。如果我们找到一个辅音,我们将增加距离。距离值是 Lambda 的一个状态,我们用一个很大的值初始化它,这里是字符串的大小。
然后,接下来,我们从右到左做同样的事情。我们将使用 std::transform
的第二种形式,我们可以在其中使用 2 个源容器并创建一个新目标。因此,我们将使用字符串和已经(从左到右)计算出的距离 vector 并将结果再次存储在距离 vector 中,因为我们不需要新的。代码非常相似:
std::transform(s.rbegin(), s.rend(), dist.rbegin(), dist.rbegin(), [&, i = s.size()](const char c, const size_t s) mutable { if (isVowel(c)) i = 0; else ++i; return std::min(i, s); });
不同之处在于我们从右到左迭代并存储我们刚刚计算的距离和之前已经计算的距离的最小值。
就是这样。
在 main 中,我们添加一些驱动程序代码并在控制台上生成一些输出。
我希望我能以一种易于理解的方式解释该算法。
如有疑问,请提出。
关于c++ - 解决到最近元音程序的距离问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65414968/
A是不同元素的序列,B是A的子序列,A-B是A中的所有元素,但不是B中的所有元素距离(A) = 总和|a(i)-a(i+1)|从 i=1 到 n-1找到一个子序列 B 使得 Dist(B)+Dist(
我想通过计算每对中所有(多维)点集之间距离的平均值来量化组相似性。 我可以很容易地手动为每对组手动完成此操作,如下所示: library(dplyr) library(tibble) library(
在 OpenXML 中用于指定大小或 X、Y 坐标的度量单位是什么? (介绍)。 将那些与像素匹配是否有意义,如果是这样,那些如何转换为像素? graphicFrame.Transform = new
我想知道是否有人可以帮助我替换过渡层中的值。 如果我尝试: transitionlayer[transitionlayer >= 0.14] = 0.14 : comparison (5) is
我在 firebase 中有一个列表,其中包括地理位置(经度和纬度),并且我想获得距给定坐标最近的 10 个位置。 我正在从 MySQL 过渡,在那里我将计算 SELECT 中的距离, 并在 ORDE
如何在 Python 中根据 2 个 GPS 坐标计算速度、距离和方向(度)?每个点都有纬度、经度和时间。 我在这篇文章中找到了半正矢距离计算: Calculate distance between
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 6 年前。 Improve this ques
我只想使用 matplotlib 标记两条曲线之间发生最大偏差的位置。请帮助我。 垂直距离适用于 Kolmogorov–Smirnov test import numpy as np %matplot
我有一个包含数万行重复项的文件。我想根据行号找到重复项之间的平均时间/距离。 例如:(其中第一列是行号) 1 string1 2 string2 3 string2 4 string1 5 strin
用公式speed=distance/time计算时间 但时间总是0我的输入是 distance=10 和 speed=5 我的输出必须 = 2 #include int main() { in
我正在使用 Levenshtein 算法来查找两个字符串之间的相似性。这是我正在制作的程序的一个非常重要的部分,因此它需要有效。问题是该算法没有发现以下示例相似: CONAIR AIRCON 算法给出
对于一个房地产网站,我需要实现一个允许搜索文本和距离的搜索机制。 当 lat 和 lon 记录在单独的列中时,在 MySQL 表上进行距离计算很容易,但房子往往有 LOT true/false 属性。
是否可以在触发前更改 UIPanGestureRecognizer 的距离?目前的实现似乎在触发前有 5-10 像素的距离余量,我想降低它如果可能的话。 原因是我将 UIPanGestureRecog
我试图找到两个网格之间的偏差。例如在 3d 空间中定义的两组点之间的差异,我计划使用一些 3d 可视化工具来可视化距离,例如QT3d 或一些基于开放式 gl 的库。 我有两组网格,基本上是两个 .ST
所以,我有这个函数可以快速返回两个字符串之间的 Levenshtein 距离: Function Levenshtein(ByVal string1 As String, ByVal string2
我正在尝试用字典创建一个光学字符识别系统。 事实上,我还没有实现字典=) 我听说有一些基于 Levenstein 距离的简单指标,这些指标考虑了不同符号之间的不同距离。例如。 'N' 和 'H' 彼此
我在PostGIS数据库(-4326)中使用经纬度/经度SRID。我想以一种有效的方式找到最接近给定点的点。我试图做一个 ORDER BY ST_Distance(point, ST_GeomF
我想从线串的一端开始提取沿线串已知距离处的点的坐标。 例如: library(sf) path % group_by(L1) %>% summarise(do_union =
我已经编写了这些用于聚类基于序列的数据的函数: library(TraMineR) library(cluster) clustering <- function(data){ data <- s
是否可以设置 UILabel 的行之间的距离,因为我有一个 UILabel 包含 3 行,并且换行模式是自动换行? 最佳答案 如果您指的是“前导”,它指的是类型行之间的间隙 - 您无法在 UILabe
我是一名优秀的程序员,十分优秀!