2010-01-29 15 views
5

मैंने जंगली कार्ड बनाने के लिए, सही क्रम में तारों की सरणी में सामान्य वर्ण प्राप्त करने के लिए फ़ंक्शन पर काम करने के दिन बिताए।स्ट्रिंग्स की सरणी में सामान्य वर्ण खोजें, सही क्रम में

मेरी समस्या को समझाने के लिए यहां एक उदाहरण दिया गया है। मैंने लगभग 3 फ़ंक्शंस बनाए, लेकिन मेरे पास हमेशा एक बग होता है जब प्रत्येक अक्षर की पूर्ण स्थिति अलग होती है।

के "वाइल्डकार्ड चार" "+" है मान लेते हैं:

Array(
0 => '48ca135e0$5', 
1 => 'b8ca136a0$5', 
2 => 'c48ca13730$5', 
3 => '48ca137a0$5'); 

लौट चाहिए:

$wildcard='+8ca13+0$5'; 

इस उदाहरण में, मुश्किल बात दूसरों की तुलना में है कि $array[2] के रूप में 1 वर्ण अधिक है।

अन्य उदाहरण:

Array(
0 => "case1b25.occHH&FmM", 
1 => "case11b25.occHH&FmM", 
2 => "case12b25.occHH&FmM", 
3 => "case20b25.occHH&FmM1"); 

लौट चाहिए:

$wildcard='case+b25.occHH&FmM+'; 

इस उदाहरण में, मुश्किल भागों हैं:
- दोहरा वर्ण, 1 जैसे -> 11 में "को हटाना "भाग, और सी -> सामान्य भाग में सीसी
- $ 2 में $ 2" char "$ 2 [0] & [3]" हटाने के लिए "भाग में समान स्थिति में नहीं है
- अंतिम स्ट्रिंग के अंत में "1" चार

मुझे वास्तव में मदद चाहिए क्योंकि मुझे इस फ़ंक्शन का समाधान नहीं मिल रहा है और यह मेरे आवेदन का मुख्य हिस्सा है।

अग्रिम धन्यवाद, प्रश्न पूछने में संकोच नहीं करें, मैं जितनी जल्दी हो सके उत्तर दूंगा।

Mykeul

+0

यह आपको मार नहीं देगा, इसलिए इतनी जोर से चिल्लाने की कोई आवश्यकता नहीं है ;-) – raoulsson

+0

हम ठीक है ... यह "HEEELLPPP" पर संपादन भाग के लिए था :) :) यह मुझे मार नहीं देगा, हाँ, लेकिन मैं वास्तव में, वास्तव में, इसे काम करने की जरूरत है ... – Mykeul

+0

खुशी है कि आपने इसे बदल दिया! यह अभी पढ़ने के लिए अभी अच्छा है :-) – raoulsson

उत्तर

2

मुख्य कोड:
चरण 1: लंबाई द्वारा क्रमबद्ध तार, कम से कम सबसे लंबे समय तक के लिए, सरणी में []
चरण 2: सरणी में स्ट्रिंग की तुलना [0] और सरणी [1] $ temp_wildcard
पाने के लिए चरण 3: सरणी में स्ट्रिंग की तुलना [2] $ temp_wildcard साथ बनाने के लिए नए $ temp_wildcard
चरण 4: $ temp_wildcard के साथ प्रत्येक स्ट्रिंग की तुलना जारी रखें - पिछले $ वाइल्डकार्ड अपने $ temp_wildcard

ठीक है, इसलिए अब हम कर रहे हैं अपनी वाइल्डकार्ड स्ट्रिंग को वापस करने के लिए दो तारों की तुलना करने की समस्या के बारे में समस्या के नीचे।

सबराउटिन कोड: स्ट्रिंग्स-बाय-कैरेक्टर की तुलना करें, तुलनात्मक मिलान से जब आपके रिटर्न वैल्यू में वाइल्डकार्ड को प्रतिस्थापित करें।

विभिन्न लंबाई की समस्या को संभालने के लिए, इस तुलना को प्रत्येक वर्ण के लिए एक अतिरिक्त समय चलाएं कि दूसरी स्ट्रिंग ऑफसेट के साथ लंबी है। (स्ट्रिंग 1 [x] की तुलना स्ट्रिंग 2 [x + ऑफ़सेट] से करें।) प्रत्येक लौटाई गई स्ट्रिंग के लिए, वाइल्डकार्ड वर्णों की संख्या गिनें। Subroutine जवाब वाइल्डकार्ड वर्णों की सबसे कम संख्या के साथ जवाब वापस करना चाहिए।

शुभकामनाएं!

+0

हैलो और आपके awnser के लिए धन्यवाद! यह एक अच्छा अलौकिक है और मैं इस शाम को आजमाऊंगा। अभी भी 1 मामला है जो मैं मेल नहीं कर सकता: ऐरे ("एबीसीडी", "बीसीडीई"); => एक ही लंबाई लेकिन मुझे "+ बीसीडी +" मिलना चाहिए। यह अभी भी एक बहुत अच्छा algorythm है, मेरे से बेहतर है। मायकेल – Mykeul

3

लगता है आप उदाहरण के तार के सेट से बाहर नियमित अभिव्यक्ति की तरह कुछ बनाना चाहते हैं। यह सामान्य रूप से काफी ट्रिकी हो सकता है। इस लिंक, यकीन नहीं अगर यह प्रासंगिक है मिल गया: http://scholar.google.com/scholar?hl=en&rlz=1B3GGGL_enEE351EE351&q=%22regular%20expression%20by%20example%22&oq=&um=1&ie=UTF-8&sa=N&tab=ws

दूसरी ओर, यदि आप केवल एक विशिष्ट वाइल्डकार्ड "0 या अधिक वर्ण" अर्थ की जरूरत है, तो यह बहुत आसान होना चाहिए। Levenshtein distance एल्गोरिदम 2 तारों के बीच समानता की गणना करता है। आम तौर पर केवल परिणाम की आवश्यकता होती है, लेकिन आपके मामले में मतभेदों के स्थान महत्वपूर्ण हैं। आपको एन स्ट्रिंग्स के लिए इसे अनुकूलित करने की भी आवश्यकता है।

तो मैं इस एल्गोरिदम का अध्ययन करने की सलाह देता हूं और उम्मीद है कि आपको कुछ समस्याएं मिलेंगी कि आपकी समस्या का समाधान कैसे करें (कम से कम आपको टेक्स्ट एल्गोरिदम और गतिशील प्रोग्रामिंग के साथ कुछ अभ्यास मिलेगा)।

PHP में

यहाँ एल्गोरिथ्म: _http: //en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Levenshtein_distance#PHP

आप "diff" की पीएचपी कार्यान्वयन के लिए खोज करने के लिए भी कर सकते हैं। http://paulbutler.org/archives/a-simple-diff-algorithm-in-php/

+0

हैलो, आपके awnser के लिए धन्यवाद, हालांकि: - मुझे नहीं लगता कि मैं एक रेगेक्स का उपयोग कर सकता हूं क्योंकि मैं स्ट्रिंग में वर्णों के प्रकार को नहीं जानता, न ही प्रकार के od अक्षर मुझे हटाएं - मैंने लेवेनशेटिन दूरी के बारे में पढ़ा है लेकिन यह "मतभेदों की संख्या" बताता है, अंतर नहीं है ... और कोई आदेश नहीं है। - अंतिम लिंक एक PHP फ़ाइल डाउनलोड लिंक दिखाता है जो अब और काम नहीं करता है और टिप्पणियां केवल स्क्रिप्ट के कुछ हिस्सों को प्रदान करती हैं। मुझे वास्तव में सामान्य वर्ण और क्रम रखने की आवश्यकता है। – Mykeul

संबंधित मुद्दे