Как заменить подстроку в основной входной строке с другой подстрокой без использования встроенных функций? -- clojurescript пол Связанный проблема

how to replace substring in a main input string with another substring without using any in built functions?


2
vote

проблема

русский

Каждая функция, которую я искал в сети, используя любую из встроенных функций, таких как Find (), заменить (). etc. Я провел исследования в моих академических книгах, библиотеках и интернете, но не смог найти решение. Может ли кто-нибудь из вас, пожалуйста, предоставьте алгоритм для реализации вышеуказанной функции без использования встроенных функций?

Английский оригинал

Every function i searched in the net utilizing any one of the inbuilt functions like find(),replace().etc . I did research in my academic books,libraries and internet but i couldn't find the solution. can any one of you please provide an algorithm for implementing the above function without using any in built functions?

</div
  
 
 

Список ответов

2
 
vote

Ну, давайте сначала попытаемся решить некоторые более простые проблемы и работать до строки замены проблемы. Во-первых, как мы определяем, что две строки равны? Довольно простой, верно? Если строки имеют одинаковую длину, а те же символы в том же порядке, то они равны:

 <код> (defn str-eq? [s1 s2]   (and (= (count s1) (count s2))        (every? identity                (map = s1 s2))))   

Хорошо, давайте попробуем проверку, есть ли строка какая-то другая строка в качестве префикса. Это оказывается практически идентичное решение, мы просто ослабили требование, чтобы оба строки были одинаковой длины:

 <код> (defn str-prefix? [s prefix]   (and (>= (count s) (count prefix))        (every? identity                (map = s prefix))))   

Теперь давайте начнем думать о том, как мы можем найти все вхождения какой-то строки S1 в некоторой строке с. Ну, если мы возьмем все суффиксы S, приказали от самого дольше всего до самого короткого, мы можем определить, где S1 возникает в S, проверяя, какие суффиксы S1 представляет собой префикс:

 <код> (defn str-suffixes [s]   (->> s        (iterate next)        (take (inc (count s))) ;; make sure we include the empty string        (map #(apply clojure.core/str %))))  (defn str-find [s s1]   (->> (str-suffixes s)        (map (fn [index suffix]                (if (str-prefix? suffix s1)                  index                  nil))             (iterate inc 0))        (filter identity)))   

Наконец, пришло время заменить строку. Мы начнем с простого случая, когда строка S1 отображается в строке S, максимум один раз при индексе. Просто объединяйте все перед индексом с заменой строки, S2, и все после возникновения вхождения S1 в S:

 <код> (defn str-replace [s s1 s2]   (reduce (fn [s index]             (apply clojure.core/str                     (concat (take index s)                            s2                            (drop (+ index (count s1)) s))))           s           (str-find s s1)))   

Если S1 появляется в нескольких раз, вы обнаружите, что это не работает. Это связано с тем, что Str-Find дает свои результаты в порядке возрастания. С каждой заменой строки мы делаем, мы недействием индексов позже в строке. Чтобы исправить это, мы просто обрабатываем каждый индекс от максимально наименее:

 <код> (defn str-replace [s s1 s2]   (reduce (fn [s index]             (apply clojure.core/str                     (concat (take index s)                            s2                            (drop (+ index (count s1)) s))))           s           (sort > (str-find s s1))))   

А вот в действии:

 <код> (str-replace "foobar" "foo" "baz") => "bazbar" (str-replace "foobar" "bar" "baz") => "foobaz" (str-replace "foobarbarfoo" "bar" "bazz") => "foobazzbazzfoo" (str-replace "foobar" "z" "baz") => "foobar"   

При решении таких проблем, это помогает подумать о том, что существуют другие подобные операции, и как они могут быть связаны с тем, кого вы пытаетесь осуществить. Дайте мне знать, если у вас есть какие-либо вопросы.

 

Well, lets try to solve some simpler problems first and work our way up to the string replace problem. First, how do we determine two strings are equal? Fairly straightforward, right? If the strings have the same length, and the same characters in the same order, then they are equal:

(defn str-eq? [s1 s2]   (and (= (count s1) (count s2))        (every? identity                (map = s1 s2)))) 

Okay, lets try checking if a string has some other string as a prefix. This turns out to have an almost identical solution, we just ease the requirement that both strings be the same length:

(defn str-prefix? [s prefix]   (and (>= (count s) (count prefix))        (every? identity                (map = s prefix)))) 

Now, lets start thinking about how we might find all occurrences of some string s1 in some string s. Well, if we take all of the suffixes of s, ordered from longest to shortest, we can determine where s1 occurs in s by checking which suffixes s1 is a prefix of:

(defn str-suffixes [s]   (->> s        (iterate next)        (take (inc (count s))) ;; make sure we include the empty string        (map #(apply clojure.core/str %))))  (defn str-find [s s1]   (->> (str-suffixes s)        (map (fn [index suffix]                (if (str-prefix? suffix s1)                  index                  nil))             (iterate inc 0))        (filter identity))) 

Finally, it's time for the string replace. We'll start with the simple case where a string s1 appears in a string s at most once at index. Just concatenate everything before the index with the replacement string, s2, and everything after the occurrence of s1 in s:

(defn str-replace [s s1 s2]   (reduce (fn [s index]             (apply clojure.core/str                     (concat (take index s)                            s2                            (drop (+ index (count s1)) s))))           s           (str-find s s1))) 

If s1 appears in s multiple times, you'll find that this doesn't work. This is because str-find gives its results in ascending order. With every string replacement we do, we invalidate indices later in the string. To fix this, we just process each index from greatest to least:

(defn str-replace [s s1 s2]   (reduce (fn [s index]             (apply clojure.core/str                     (concat (take index s)                            s2                            (drop (+ index (count s1)) s))))           s           (sort > (str-find s s1)))) 

And here it is in action:

(str-replace "foobar" "foo" "baz") => "bazbar" (str-replace "foobar" "bar" "baz") => "foobaz" (str-replace "foobarbarfoo" "bar" "bazz") => "foobazzbazzfoo" (str-replace "foobar" "z" "baz") => "foobar" 

When solving problems like this, it helps to think of what other similar operations there are, and how they might be related to the one you're trying to implement. Let me know if you have any questions.

</div
 
 

Связанный проблема

0  CORE.ASYNC MACHINE, которая петли до того, как FX возвращает True  ( Core async machine that loops until a fx returns true ) 
При загрузке веб-сайта я часто имею необходимость загрузить код после того, как произошло некоторое другое структурное событие DOM. Поэтому я часто заканчиваю...

2  Как подключить камин. Проведите браузер REPL  ( How to connect fireplace vim to browser repl ) 
Можно ли подключить Vim.fireplace в браузере REPL? У меня есть настройка, используя Остин, но если я попытаюсь что-то оценить внутри VIM, я получаю: <код> o...

8  Как я могу конвертировать clojure.contrib.monads, который будет использоваться с clojurecript?  ( How can i convert clojure contrib monads to be used with clojurescript ) 
Я хотел бы использовать Clojure Monad Library Clojure.contrib.monads в Clojurecript. Существует ли реализация, которая была проверена, как известно, работает ...

7  Clojure - прогулка с пути  ( Clojure walk with path ) 
Я ищу функцию, похожую на те, которые в clojure.walk , которые имеют <код > inner Функция, которая принимает в качестве аргумента: . не ключ и значение, к...

3  Обновление состояния приложения OM-следующее из удаленного ответа  ( Updating om next app state from remote response ) 
Я немного запутался об обновлении состояния приложения с пульта дистанционного управления. Я сделал симулированный пульт дистанционного управления, который от...

3  В ClojureScript, задержка `: на click` события и триггер, только если`: по-двойному click` событие не срабатывает  ( In clojurescript delay on click event and trigger only if on double click ) 
<Р> Что такое простой способ задержки <код> :on-click событие, чтобы увидеть первый, если <код> :on-double-click событие запускается? <код> [:div {:on-clic...

0  CLOJURESCRICT Недоставлено VAR Goog.Structs / map  ( Clojurescript undeclared var goog structs map ) 
Я добавил библиотеку в мой проект, и теперь я получаю эту ошибку <Код> clojurescript undeclared Var goog.structs/Map Это библиотека: <Код> https://github...

1  Запрос на почту находится в ISO-8859 после обновления High Sierra  ( Post request is in iso 8859 after high sierra update ) 
Я делаю веб-приложения, используя clojure и clojurecript, компилируемый leinken. Моя проблема в том, что после обновления MacOS в High Sierra, мое собранное...

1  Как сделать эти строковые функции сопоставления в Clojure (Script)?  ( How to make these string matching functions in clojurescript ) 
Рассмотрим следующую многострочную строку <код> S : <код> apple banana berry cantelope Я пытаюсь написать / найти функции Clojure, которые я позвоню в э...

4  Re-кадр дб организация  ( Re frame db organization ) 
<Р> Мы наш Re-кадр приложение БД организована так (упрощенно для этого поста): <код> {:meta {:page/search {:page/component #'...} :page/details {:page/compon...

0  Выходные отдельные файлы JS, но поделитесь некоторыми кодом с Leinhen?  ( Output separate js files but share some code with leiningen ) 
Я немного запутался на том, как лучше настроить Project.clj для моего использования. Мы пытаемся встроить новые технологии в старую, поэтому мы создаем отде...

3  Как получить индекс для предмета в реагенте  ( How to get index for an item in reagent ) 
Когда я повторяю вектор в реагенте, как это: <код> grep -E 'Title|Amount|AwardID|FirstName|LastName| *.xml4 Я хотел бы получить индекс конкретного элемен...

1  Как генерировать CSS с помощью сада с Clojurecript (Лейн-сад)  ( How to generate css using garden with clojurescript lein garden ) 
Я не могу получить сад, чтобы работать с Clojurecript. Есть ли заклинание для выполнения? Документы вообще не упоминают CLOJURUCTSCRICS, просто Clojure ... но...

1  Проект Clojurecript нужен менеджер процессов?  ( Does clojurescript project need a process manager ) 
Я хочу начать проект, который использует <код> Node.js+Express.js+ClojureScript в свете https: //gist.github.com/jneira/1171737 . Но я боюсь, что если я раз...

1  Функция, которая создает функции, которые могут быть допрошены в течение количества того, что они были вызваны  ( A function that creates functions that can be interrogated for the number of tim ) 
Я хочу создать функцию, которая создает другие функции, которые вспоминают, сколько раз они назывались - не сложно. Но я хочу допрашивать эти функции в какое-...

Связанный проблема

0  CORE.ASYNC MACHINE, которая петли до того, как FX возвращает True 
2  Как подключить камин. Проведите браузер REPL 
8  Как я могу конвертировать clojure.contrib.monads, который будет использоваться с clojurecript? 
7  Clojure - прогулка с пути 
3  Обновление состояния приложения OM-следующее из удаленного ответа 
3  В ClojureScript, задержка `: на click` события и триггер, только если`: по-двойному click` событие не срабатывает 
0  CLOJURESCRICT Недоставлено VAR Goog.Structs / map 
1  Запрос на почту находится в ISO-8859 после обновления High Sierra 
1  Как сделать эти строковые функции сопоставления в Clojure (Script)? 
4  Re-кадр дб организация 
0  Выходные отдельные файлы JS, но поделитесь некоторыми кодом с Leinhen? 
3  Как получить индекс для предмета в реагенте 
1  Как генерировать CSS с помощью сада с Clojurecript (Лейн-сад) 
1  Проект Clojurecript нужен менеджер процессов? 
1  Функция, которая создает функции, которые могут быть допрошены в течение количества того, что они были вызваны 



© 2021 www.qaru.top All Rights Reserved. Q&A House все права защищены


Licensed under cc by-sa 3.0 with attribution required.