计算两个 NSString 之间的差异数

2023-11-24

如何计算两个 NSString 之间的差异数。

Example:

NSString 1 = "this is a string"

NSString 2 = "Tihs isa string"

应返回:4(一个用于大写“T”,一个用于“i”、“h”和缺少的空格)


您正在寻找的是编辑距离.

Objective-C 中的实现:

------------------------------------------------------------------------ 

//
//  NSString-Levenshtein.h
//
//  Created by Rick Bourner on Sat Aug 09 2003.
//  [email protected]

@interface NSString(Levenshtein)

// calculate the smallest distance between all words in stringA and stringB
- (float) compareWithString: (NSString *) stringB;

// calculate the distance between two string treating them each as a
// single word
- (float) compareWithWord: (NSString *) stringB;

// return the minimum of a, b and c
- (int) smallestOf: (int) a andOf: (int) b andOf: (int) c;

@end

--------------------------------------------------------------------

//
//  NSString-Levenshtein.m
//
//  Created by Rick Bourner on Sat Aug 09 2003.
//  [email protected]

#import "NSString-Levenshtein.h"


@implementation NSString(Levenshtein)

// calculate the mean distance between all words in stringA and stringB
- (float) compareWithString: (NSString *) stringB
{
     float averageSmallestDistance = 0.0;
     float smallestDistance;
     float distance;

     NSMutableString * mStringA = [[NSMutableString alloc]  initWithString: self];
     NSMutableString * mStringB = [[NSMutableString alloc]  initWithString: stringB];


     // normalize
     [mStringA replaceOccurrencesOfString:@"\n"
                              withString: @" "
                                 options: NSLiteralSearch
                                   range: NSMakeRange(0, [mStringA  length])];

     [mStringB replaceOccurrencesOfString:@"\n"
                              withString: @" "
                                 options: NSLiteralSearch
                                   range: NSMakeRange(0, [mStringB  length])];

     NSArray * arrayA = [mStringA componentsSeparatedByString: @" "];
     NSArray * arrayB = [mStringB componentsSeparatedByString: @" "];

     NSEnumerator * emuA = [arrayA objectEnumerator];
     NSEnumerator * emuB;

     NSString * tokenA = NULL;
     NSString * tokenB = NULL;

     // O(n*m) but is there another way ?!?
     while ( tokenA = [emuA nextObject] ) {

         emuB = [arrayB objectEnumerator];
         smallestDistance = 99999999.0;

         while ( tokenB = [emuB nextObject] )
             if ( (distance = [tokenA compareWithWord: tokenB] ) <  smallestDistance )
                 smallestDistance = distance;

         averageSmallestDistance += smallestDistance;

     }

     [mStringA release];
     [mStringB release];

     return averageSmallestDistance / [arrayA count];
}


// calculate the distance between two string treating them eash as a
// single word
- (float) compareWithWord: (NSString *) stringB
{
     // normalize strings
     NSString * stringA = [NSString stringWithString: self];
     [stringA stringByTrimmingCharactersInSet:
               [NSCharacterSet whitespaceAndNewlineCharacterSet]];
     [stringB stringByTrimmingCharactersInSet:
               [NSCharacterSet whitespaceAndNewlineCharacterSet]];
     stringA = [stringA lowercaseString];
     stringB = [stringB lowercaseString];


     // Step 1
     int k, i, j, cost, * d, distance;

     int n = [stringA length];
     int m = [stringB length];  

     if( n++ != 0 && m++ != 0 ) {

         d = malloc( sizeof(int) * m * n );

         // Step 2
         for( k = 0; k < n; k++)
             d[k] = k;

         for( k = 0; k < m; k++)
             d[ k * n ] = k;

         // Step 3 and 4
         for( i = 1; i < n; i++ )
             for( j = 1; j < m; j++ ) {

                 // Step 5
                 if( [stringA characterAtIndex: i-1] == 
                      [stringB characterAtIndex: j-1] )
                     cost = 0;
                 else
                     cost = 1;

                 // Step 6
                 d[ j * n + i ] = [self smallestOf: d [ (j - 1) * n + i ] + 1
                                             andOf: d[ j * n + i - 1 ] +  1
                                             andOf: d[ (j - 1) * n + i -1 ] + cost ];
             }

         distance = d[ n * m - 1 ];

         free( d );

         return distance;
     }
     return 0.0;
}


// return the minimum of a, b and c
- (int) smallestOf: (int) a andOf: (int) b andOf: (int) c
{
     int min = a;
     if ( b < min )
         min = b;

     if( c < min )
         min = c;

     return min;
}

@end

上述来源的作者:Rick Bourner,http://www.merriampark.com/ldobjc.htm

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算两个 NSString 之间的差异数 的相关文章

  • CMSampleBufferSetDataBufferFromAudioBufferList 返回错误 12731

    我正在尝试捕获应用程序声音并将其传递给 AVAssetWriter 作为输入 我正在设置音频单元的回调以获取 AudioBufferList 问题始于将 AudioBufferList 转换为 CMSampleBufferRef 它总是返回
  • 将语音添加到自定义 UIMenuController

    我创建了一个自定义UIMenuController in a UIWebView但它似乎摆脱了 说出选择 选项UIMenuController在那之后 所有测试设备上的 偏好设置 中都打开了发言选择选项 并且它出现在其他应用程序中 包括非
  • 使用 AudioStreamer 获取 MP3 ID3 元数据和歌曲持续时间

    我在用着马特 加拉格尔的 AudioStreamer http cocoawithlove com 2008 09 streaming and playing live mp3 stream html通过 HTTP 播放 MP3 我需要知道
  • 在回调函数中调用目标c函数

    如何在回调函数中调用目标c函数 回调函数 static OSStatus inputRenderCallback void inRefCon AudioUnitRenderActionFlags ioActionFlags const Au
  • UISlider不会自动重绘

    我的应用程序上有一个 UISlider 有时我不仅需要更新它的值 还需要更新它的minimumValue 值已更改 但如果我调用 setValue 方法或为滑块分配新值 它会具有新值 但滑块不会将自身重新绘制到该新值应有的位置 我怎样才能重
  • iPhone SDK中的短信正文

    我需要从我的 iPhone 应用程序发送短信 SMS 的正文是以编程方式创建的 因此 当我点击按钮时 短信应用程序应该打开 并在其中预先输入我的消息 有人知道怎么做吗 需要帮忙 提前致谢 世宾 您无法设置短信正文 根据官方 SDK 您可以从
  • UILabel UILongPressGestureRecognizer 不起作用?

    我怎样才能得到UILongPressGestureRecognizer在 uilabel 当我实现以下代码时 它不会调用该函数 那么请告诉我我做错了什么 UILongPressGestureRecognizer longPress UILo
  • 从plist文件中读取数据

    我正在尝试为我的 iPhone 应用程序实现保存状态 我有一个名为 SaveData plist 的 plist 文件 我可以通过以下方式读取它 NSString pListPath2 bundle pathForResource Save
  • 游戏中心邀请处理程序,它属于哪里?

    我已经搜索了该网站并发现了这个 GameCenter 邀请处理程序 https stackoverflow com questions 4639284 gamecenter invitation handler He says 正如文档中所
  • 核心数据对多关系。它们是延迟加载吗?

    我在核心数据 适用于 iPhone 中有典型的模型 其中包含部门和员工 部门 gt gt 员工 我不想每次加载时都加载一个部门的所有员工 所以我想将员工创建为获取的属性 我想我可以定义一些像这样的谓词 employee deparmentI
  • ios 在后台处理推送通知

    我想保存应用程序处于后台状态时到达的推送通知 我知道关于 void application UIApplication application didReceiveRemoteNotification NSDictionary userIn
  • 如何将iPhone/iPad应用程序更改为仅iPhone?

    我有点愚蠢 将我的应用程序构建为同时针对 iPhone 和 iPad 而实际上它应该只针对 iPhone 如何更改设置以使构建仅适用于 iPhone 我实际上已经完成了应用程序的编码并准备提交它 所以希望这只是更改一些晦涩的项目设置的情况
  • 如何将相机中的图像保存到 iPhone 图库中的特定文件夹?

    嘿 我是 iPhone 新手 最近我一直在尝试制作一个应用程序 基本上 我想要做的是 如果用户将从相机捕获任何图像 那么它应该保存在设备库中 我知道如何将照片保存在图库中 它对我有用 但我无法将所有捕获的图像保存到设备图库中的特定文件夹 例
  • 在 iOS 上使用 Web 服务的最佳方式?

    我想构建一个 iOS 应用程序 让您登录到网络服务 之后 应用程序将 当用户选择时 通过 https 发送登录名 密码以及请求的变量 例如 在请求 新闻更新 后 它将收到 XML 格式的请求信息 类似于
  • iPhone 应用程序在首次 Facebook Connect 授权/登录后崩溃

    我一直在到处寻找答案 但找不到 问题是 我有一个 iPhone 应用程序 在 AppStore 上 它使用脸书 iPhone SDK https github com facebook facebook iphone sdk 我使用 SDK
  • Javascript - deepEqual 比较

    问题 来自 Eloquent Javascript 第二版 第 4 章 练习 4 编写一个函数 deepEqual 它接受两个值 并且仅当它们相等时才返回 true 是相同的值或具有相同属性的对象 其值也是 与对 deepEqual 的递归
  • iOS 中的 CSV 逐行解析

    我正在 Objective c 中解析 CSV 文件 该文件包含如下内容 line 40 Rising searches line 41 nabi avc Breakout line 42 stonewall 700 line 43 med
  • 个人帐户开发者之间的 Apple 开发/分发证书

    我一直在到处寻找有关处理证书的正确答案 想象一下以下帐户 Joe拥有个人 Apple 帐户 但他根本不会编码 他只是发布了该应用程序并将其称为自己的 Bob还有一个个人 Apple 帐户 Bob 是一位编码专家 Joe 付费让他开发他的第一
  • 如何在 C++ 中获取两个向量共有的字符?

    我正在尝试比较两个向量对象 并返回一个包含两个向量中出现的所有字符的向量 如果不编写一些非常复杂的手动方法 将第一个向量中的每个字符与第二个向量中的每个字符进行比较 并使用 if 将其添加到第三个向量 如果它们匹配 将返回 我将如何解决这个
  • 如何衡量两个字符串之间的相似度? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给定两个字符串text1 and text2 public SOMEUSABLERETURNTYPE Compare string t

随机推荐

  • 使用 sed 在匹配文本块后插入一行

    我尝试使用 sed 在以下文件中的 Block B 之后插入一行 Block A line 1 line 2 Block B line 1 line 2 Block C line 1 line 2 我使用的命令 sed Block B a
  • 在运行时设置 href 属性

    设置的最佳方法是什么href的属性 a 在运行时使用 jQuery 标记 另外 你如何获得的值href的属性 a 使用 jQuery 标记 要获取或设置 HTML 元素的属性 您可以使用element attr jQuery 中的函数 为了
  • javac 错误:仅在明确请求注释处理时才接受类名

    当我编译我的java程序时出现这个错误 error Class names EnumDevices are only accepted if annotation processing is explicitly requested 1 e
  • 尝试加载 Oracle 客户端库抛出 BadImageFormatException

    尝试从 net 连接到 Oracle 数据库时出现以下异常 尝试加载 Oracle 客户端库引发了 BadImageFormatException 用32位运行64位模式时会出现这个问题 安装了 Oracle 客户端组件 经过许多链接后 我
  • 如何正确声明自引用模板类型?

    如何声明引用自身的模板类型 template
  • 如何计算 R 中样条函数的导数?

    R 可以使用 splines 库中的 splinefun 生成样条函数 但是 我需要评估该函数的一阶和二阶导数 有没有办法做到这一点 例如 library splines x lt 1 10 y lt sin pi x just an ex
  • 在 Meteor-Cordova 应用程序中播放声音

    使用没有cordova的流星我可以在浏览器中使用以下命令播放声音 new Audio test mp3 play where test mp3位于公用文件夹中 但是 一旦我在设备上将我的应用程序作为 cordova 应用程序运行 我就无法播
  • 选择元素的增长方式与显示 Flex 中的输入元素的增长方式不同

    我出现了意想不到的行为在我的设置中 输入按预期水平增长 但在具有选择控件的行上 增长似乎被扭曲 我怀疑某些风格有所不同 但仔细检查后却一无所获 谷歌搜索没有给出任何信息 我找不到任何关于隐式边距或选择填充的信息 这是关于什么的以及我该如何杀
  • JavaScript 异常列表

    这次我没有任何问题 但出于好奇 我想知道 JavaScript 中有多少异常 例如我正在使用以下代码
  • 将 pandas csv 保存到子目录

    我试图将以下代码的输出保存到子目录中 for gp in g filename gp 0 csv print filename gp 1 to csv filename 我首先创建了子目录 os makedirs MonthlyDataSp
  • 俄语 mongodb 全文搜索

    我正在尝试在 mongodb 中使用全文搜索 gt db collection insert text gt db collection insert text gt db collection insert text gt db coll
  • 无法验证应用程序并将其提交到 Mac App Store

    我已经为 iOS 应用程序进行了无数次协同设计和提交 这次让我震惊的是 Mac App Store 我反复收到相同的错误消息 我的名字 是一个有效的身份 然而 您没有关联的包标识 我在堆栈溢出上认识到这两个主题 mas 代码签名身份私钥 a
  • 当使用 Object.create(null) 创建对象时 __proto__ 如何工作

    考虑以下 JavaScript 代码 var a Object create null a foo 1 var b Object create a console log b foo prints 1 console log b proto
  • 切换两个 INT 变量的大小写

    考虑以下代码 if xPoint gt 0 yPoint gt 0 m navigations Directions SouthEast else if xPoint gt 0 yPoint lt 0 m navigations Direc
  • 如何在UIView上设置渐变边框?

    在上面放置一个简单的边框非常容易UIView 您只需链接到QuartzCore 导入它并使用 self view layer borderColor UIColor redColor CGColor self view layer bord
  • 使用fork时内存是如何映射的?

    我是 fork 的新手 我到处都读到 当调用 fork 时 当前 调用 进程的精确副本就会启动 现在 当我运行以下代码时 应该有两个不同的进程 有两个不同的进程分配给它们的变量和函数的内存位置 include
  • 如何关闭 sbcl 中的调试器

    我目前正在尝试学习 common lisp 并且一直在使用 sbcl 我希望这是一个不错的实现选择 来自 ruby 和 irb 的我发现此时每个错误的自动转移到调试器有点烦人 有没有办法在我玩的时候暂时关闭它 Common Lisp 有一个
  • Wicked PDF +字体+heroku+rails3.2

    我在用着邪恶 pdf使用 Rails 3 2 11 和 ruby 1 9 3 从 HTML 生成 PDF 并部署到 Heroku 我的 pdf css scss erb font face font family DosisMedium f
  • 如何在 Symfony 4 结构的参数文件中检索环境变量?

    我使用 Symfony Flex 进行了全新的 Symfony 安装 新的框架属于下一个 Symfony 4 目录结构 我添加并配置第一个第三方包 HWIOAuthBundle 该捆绑包用于使用两个秘密信息通过 Twitter 进行连接 我
  • 计算两个 NSString 之间的差异数

    如何计算两个 NSString 之间的差异数 Example NSString 1 this is a string NSString 2 Tihs isa string 应返回 4 一个用于大写 T 一个用于 i h 和缺少的空格 您正在